1, [abc] a, b 或 c
[^abc] 任何字符,除了a,b 或 c
[a-zA-Z] a 到 z 或 A 到 Z,两头字符都包括在内
[a-d[m-p]] a 到 d 或 m 到 p :[a-dm-p](并集)
[a-z&&[def]] d,e 或 f(交集)
2, * 任何字符
\d 数字: [0-9]
\D 非数字:[^0-9]
\s 空白字符:[\t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
3, Greedy 数量词
X? 一次或一次也没有
X* 零次或多次
X+ 一次或多次
X{n} 恰好n次
X{n,} 至少n次
X{n,m} 至少n次,但是不超过m次字符串
4, 替换功能
String s = "Hello123World";
String regex = "\\d";
String s2 = s.replaceAll(regex, "");
5, 分组功能
捕获组可以通过从左到右计算其开括号来编号,((A)(B(C)))存在4个这样的组
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
应用:叠词切割:"sdqqfgkkkhjppppkl";
String regex = "(.)\\1+"; String[] arr = s.split(regex);
应用:把字符串"我我....我...我.我...要要...要学....学学..学.编.编编.编.程...程程...程"输出为"我要学编程"
String s = "我我....我...我.我...要要...要学....学学..学.编.编编.编.程...程程...程";
String s2 = s.replaceAll("\\.+", "");
String s3 = s2.replaceAll("(.)\\1+", "$1");
6, Pattern和Matcher
Pattern p = Pattern.compile(a*b); //获取到正则表达式
Matcher m = p.matcher("aaaaaab"); //获取匹配器
boolean b = m.matches(); //看是否能匹配,匹配就返回true
等价于System.out.println("aaaaaab".matches("a*b"));
应用:获取字符串中的电话号码
String s = "我的电话号码是18988888888,曾经用过18987654321,还用过18812345678";
String regex = "1[3578]\\d{9}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) System.out.println(m.group()); //必须先find再group