正则表达式:正确的规则
专门用于对字符串的操作
规则是由符号组成的 用符号操作字符串变得简单
弊端:阅读性降低
所以学习正则就是学习符号的使用
1 匹配
String类中提供了匹配boolean matches(String regex)方法
2 切割
String类中提供了匹配boolean split(String regex)方法
3 替换
String类中提供了匹配boolean replace(String regex)方法
4 获取
创建正则表达式对象进行操作java.util.regex.Pattern
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
Matcher方法
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。
四个String中的正则表达式功能练习
public class Regex_Test1 {
public static void main(String[] args) {
// matchesDemo(); 匹配
// splitDemo(); 分割
// replace(); 替换
// getDemo(); 获取
}
private static void getDemo() {
// 实现获取将符合规则的取出来
// 用到正则表达式对象 java.util.regex.Pattern
// 1.将字符串规则封装成Pattern对象 compile(regex);
// 2.通过正则对象匹配器对象,用对将正则规则 作用到要操作的字符串上
// 3.通过匹配器对象的方法,对字符串进行操作
// 获取字符串中符合规则的内容
String temp="da jia zhu yi li , ming tian fang jia le";
// 取出由三个字母组成的单词 添加边界
String regex="\\b[a-zA-Z]{3}\\b";
// 1.将规则编译成对象
Pattern p=Pattern.compile(regex);
// 2.和字符串关联,获取匹配器对象
Matcher m=p.matcher(temp);
while (m.find())
System.out.println(m.group()+"字符长度位置"+m.start()+"-"+m.end());
}
private static void replace() {
String tel="15800000011";
String string=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
// $可以在多参数时 ,后面的参数 可以通过变换的形式取到前一个参数的组
System.out.println(string);
}
private static void splitDemo() {
// String temp="zhangsan lisi wangwu";
// String regex=" +";
// String temp="zhangsan.lisi.wangwu";
// 因为java正则表达式中.为任意字符 所以要转换成普通的点
// String regex="\\.";
// 两个反斜杠转义
String temp="qwe##qweqweeeeeeeasdwezzzz1ewe";
String regex="(.)\\1+";
// 为了实现规则的复用,用()将需要复用的规则封装
// 就称为了正则表达式中的组 每个组都有编号 从1开始
// 通过使用编号就可以复用该对象组的规则内容 注意:编号必须用到组的后面 先封装 再调用
String[] names=temp.split(regex);
for (String name :
names) {
System.out.println("+++"+name+"----");
}
}
private static void matchesDemo() {
// 需求 :校验手机号码是否正确
String tel="15800000011";
String regex="1[358][0-9]{9}";
// 正则表达式规则
boolean b=tel.matches(regex);
System.out.println(tel+b);
}
}
Test
public class Test1 {
public static void main(String[] args) {
/*
* 我我我.......我要....学学.....编程.....程
* 还原我要学编程*/
test_1();
}
private static void test_1() {
String temp="我我我.......我要....学学.....编程.....程";
/*
* 1,四个功能选择 替换
* 2,将..去掉
* 3,叠词干掉*/
temp=temp.replaceAll("\\.+","");
temp=temp.replaceAll("(.)\\1+","$1");
System.out.println(temp);
}
}
public class Test2 {
public static void main(String[] args) {
//对IP地址进行排序 192.168.1.200 10.10.10.10 3.3.50.3 127.0.0.1
test2();
}
private static void test2() {
/*排序出现问题 是按照字符串字典顺序排的序
* 问题在哪呢 是因为每一个地址段的位数不对
* 如果位数都是三位就可以了 只有补0
* 每一段位数都不同 都补两个 取后三位*/
String temp="192.168.1.200 17.10.10.10 3.3.50.3 127.0.0.1";
// 补两个零
temp=temp.replaceAll("(\\d+)","00$1");
// 取后三位
temp=temp.replaceAll("0*(\\d{3})","$1");
String[] strings=temp.split(" +");
Arrays.sort(strings);
for (String s :
strings) {
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
}
public class Test3 {
public static void main(String[] args) {
// 校验邮箱地址
test3();
}
private static void test3() {
String temp="319501967@qq.com.cn";
boolean b= temp.matches("\\w+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,3}){1,3}");
System.out.println(b);
}
// 从网上找 都有
}
//做一个邮箱爬虫
/*1.需要一个页面
2.需要用到IO技术 纯文本 用FileReader();
3.需要正则表达式对象
4.用集合装爬出来的邮箱
* */
public class Test4 {
public static void main(String[] args) throws IOException {
List<String> list=new ArrayList<>();
getEmail(list);
showEmail(list);
}
private static void getEmail(List<String> list) throws IOException {
File file=new File("D:\\IO\\本地邮箱.txt");
String regex="\\w+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,3}){1,3}";
Pattern p=Pattern.compile(regex);
// 创建pattern 对象是一个正则表达式的编译表示
BufferedReader reader=new BufferedReader(new FileReader(file));
String info=null;
while ((info=reader.readLine())!=null)
{
Matcher m= p.matcher(info);
// 对获取到的一行数据 放到matcher对象中进行解释和匹配
while (m.find())
{list.add(m.group());}
}
reader.close();
}
private static void showEmail(List<String> list) {
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String next = iterator.next();
System.out.println(next);
}
}
}
网友评论