首 ^ 匹配字符串开始的地方
尾 $ 匹配字符串结束的地方
[]如[123] 表示123
[^] 如[^123] 表示 除了123以外的所有字符
. 等价于[^\n](除换行符以外的所有任意字符)
\d 任意一个数字 [0-9]
\D 所有非数字 [^0-9]
\w 任意一个字母 数字 以及下划线 [0-9a-zA-Z]
\W 除了字母 数字 以及下划线 的任意一个(也就是说大写的是小写的补集合) [^0-9a-zA-Z]
\s 所有空白字符
\S 除了空白字符以外的 [^\s]
\b 表示单词的边界 如\bTom\b 就会匹配"Tommy Tom"中的"Tom"而不会匹配"Tommy Tom"中的"Tommy"
\B 表示[^\b]
\r 回车符
\n 换行符
\t 制表符
\f 换页符
X?
X+
X*
X{n} X出现n次
X{n,} X至少出现n次
X{n,m} X出现n到m次
| 表示或的关系 X|Y
() 分组
\n 在有分组的情况下 \1表示对分组1的引用
\ 转义字符(就是说由于正则表达式的关系 上面一些符合的意思有了变化 而转义字符就让他们变成原来的意思 如 $ 就是表示$ 而 \ 就是表示\)
String regex 正则表达式
matches方法来判断正则表达式是否正确
public static void demo5() {
String regex = "\\s";
System.out.println(" ".matches(regex));
System.out.println(" ".matches(regex));//四个空格 false
System.out.println(" ".matches(regex));//一个Tab键 true
}
正则表达式的切割
public static void demo7() {
String s="小明.小红.小华";
String[] arr = s.split("\\."); //通过正则表达式切割字符串
for(String str:arr) {
System.out.println(str);
}
System.out.println(arr[0]);
}
正则表达式的替换
String s = "wo1ai2yangruiqing";
String regex = "\\d";
String ss =s.replaceAll(regex, " "); //用正则表达式替换
System.out.println(ss); //结果为wo ai yangruiqing
String s2=s.replace('1', ' '); //结果为wo ai2yangruiqing
String s3=s2.replace('2', ' ');//结果为wo ai yangruiqing
System.out.println(s2);
// 两者等价
正则表达式的切割
1.叠词
public static void demo11() {
// 叠词切割
String s="sdqqfgkkkhjppppkl";
String regex3="(.)\\1+";
// String regex3="(.)\\1*"; 错的 因为至少要出现1次以上
String[] arr = s.split(regex3);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
结巴
//"我我..我...我.要...要.要.学学学...学编编..编.程..程程"
//改成"我要学编程"
String s="我我..我...我.要...要.要.学学学...学编编..编.程..程程";
String regex="\\.+";
String s2=s.replaceAll(regex,"");
System.out.println(s2);//我我我我要要要学学学学编编编程程程
String s3=s2.replaceAll("(.)\\1+", "$1");//代表第一组里的内容
System.out.println(s3);
Pattern和Matcher的配合使用
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static void demo13() {
Pattern p = Pattern.compile("a*b"); //获取正则表达式
Matcher m = p.matcher("aaaaab"); //获取匹配器
boolean b = m.matches(); //判断能否匹配
System.out.println(b);
//两者等价
System.out.println("aaaaab".matches("a*b"));
}
public static void demo14() {
//获取字符串的号码
String regex="1[3578]\\d{9}"; //手机号码的正则表达式
// String regex2="1[3578][0-9]{9}";
Pattern p = Pattern.compile(regex); //获取正则表达式 由于Pattern的构造器是私有的 所以要先获取Pattern的对象 才能用其中的静态方法
Matcher m = p.matcher("我的手机号码15349842925,原来的号码15184776282,妈妈的号码15184774108"); //获取匹配器
boolean b = m.matches(); //判断能否匹配
System.out.println(b); //当然匹配不了,不过可以找呀
while(m.find()) {
System.out.println(m.group());
}
boolean b2=m.find(); //找完了
System.out.println(b2); //false
}
demo14 的打印结果: