1、用到的类
Java.lang.String; java.util.regex.Pattern; java.util.regex.Matcher
2、用到正则表达式的几个例子
public static void p(Object o) { System.out.println(o); } |
①判断字符串与个正则表达式是否匹配
p("fgh".matches("[a-z]{3}")); //直接匹配 |
Pattern p = Pattern.compile("[a-z]{3}");//Pattern代表一种模式 Matcher m = p.matcher("fgh"); //Matcher叫做匹配器, //匹配结果放在m中 p(m.matches()); //判断是否匹配 |
3、Greedy数量词
X,一次或一次也没有 | p("aaaa".matches("aaaaa?")); | |
X* | X,零次或多次 | p("aaaa".matches("a*")); |
X+ | X,一次或多次 | p("aaaa".matches("a+")); |
X{n} | X,恰好 n 次 | p("aaaa".matches("a{4}")); |
X{n,} | X,至少 n 次 | p("aaaa".matches("a{1,}")); |
X{n,m} | X,至少 n 次,但是不超过 m 次 | p("aaaa".matches("a{1,4}")); |
4、字符类 [ ]只匹配一个字符
[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-d]|[m-p] |
[a-z] | a到z之间的数 |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
5、预定义字符
. | 任何字符(与行结束符可能匹配也可能不匹配) |
|
\d | digit数字:[0-9] | [0-9] |
\D | 非数字: [^0-9] | [^0-9] |
\s | whitespace空白字符: | [ \t\n\x0B\f\r] |
\S | 非空白字符: | [^\s] |
\w | 单词字符: | [a-zA-Z_0-9] |
\W | 非单词字符: | [^\w] |
\\ | 反斜杠字符 |
|
注: ①java中 \\代表\
②匹配”\”的方法为:“\\”.matches(“\\\\”);
6、边界匹配
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
7、Matcher的matches、find、lookingAt方法
matches 永远匹配整个字符串
find 找子串是否匹配(与matches可能互相影响,用reset方法重置一下)
lookingAt 每次从头开始找
Pattern p = Pattern.compile("\\d{3,5}"); String s = "123-34345-234-00"; Matcher m = p.matcher(s); p(m.matches()); m.reset(); //重置匹配器 p(m.find()); //true p(m.start()+"-"+m.end()); //0-3 p(m.find()); //true p(m.start()+"-"+m.end()); //4-9 p(m.find()); //true p(m.start()+"-"+m.end()); //10-13 p(m.find()); //false p(m.lookingAt()); //从头开始找 p(m.start()+"-"+m.end()); p(m.lookingAt()); //从头开始找 p(m.start()+"-"+m.end()); |
结果:false true true true false true true
如果不加m.reset,结果为:false true true false false true true
因为m.matches()匹配不成功后,光标会停在不匹配的地方。
8、输出匹配的起始位置和结束位置
起始位置 m.start() 起始索引
结束位置 m.end() 结束索引+1
注意:确定匹配成功后才可以使用start()和end(),否则会报错。
9、打印匹配结果
使用p(m.group());
例子:找到字符串中能匹配”java”的子串,不区分大小写
Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("java Java jaVa I Love JAVA"); while(m.find()) { p(m.group()); } |
10、字符串替换
例子:字符串中所有的子串不区分大小写,全部替换为“JAVA”。
Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("java Java jaVa"); p(m.replaceAll("JAVA")); |
11、分组group
利用( )将模式分组,第n个( )里内容对应group(n)。
Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})"); String s = "123mm-34345bb-234cc-00"; Matcher m = p.matcher(s); while(m.find()) { p(m.group()); p(m.group(1)); p(m.group(2)); p(""); } | 123mm 123 mm
34345bb 34345 bb
234cc 234 cc
|
12、Greedy、Reluctant、Possessive区别
Greedy | Reluctant | Possessive |
X? | X?? | X?+ |
X* | X*? | X*+ |
… | … | … |