1、简单的MetaCharacter
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
“. * + ?” 在正则表达式中用特定的意义,灵活使用可以方便表示不同的模式,具体内容可以参见 API 文档的 Pattern 类的内容,在这里举一个例子来表示:
1 p("a".matches(".")); //true 2 p("aa".matches("aa")); //true 3 p("aaaa".matches("a*")); //true 4 p("aaaa".matches("a+")); //true 5 p("".matches("a*")); //true 6 p("".matches("a?")); //true 7 p("aaaa".matches("a?")); //false 8 p("a".matches("a?")); //true 9 p("2345236426".matches("\d{3,10}")); //true 10 p("192.168.0.aaa".matches("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")); //false 11 p("192".matches("[0-2][0-9][0-9]")); //true
2、范围
“[ ]”,其中中括号里面的内容表示单个字符的范围,里面可以嵌套中括号。
1 p("a".matches("[abc]")); //true 2 p("a".matches("[^abc]")); //false 3 p("A".matches("[a-zA-Z]")); //true 4 p("A".matches("[a-z]|[A-Z]")); //true 5 p("A".matches("[a-z[A-Z]]")); //true 6 p("R".matches("[A-Z && [RGB]]")); //true
以下是 java 的预定义字符类:
. | 任何字符(与行结束符可能匹配也可能不匹配) |
d | 数字:[0-9] |
D | 非数字: [^0-9] |
s | 空白字符:[ x0Bf ] |
S | 非空白字符:[^s] |
w | 单词字符:[a-zA-Z_0-9] |
W | 非单词字符:[^w] |
举例:
1 p(" ".matches("\s{4}")); //true 2 p(" ".matches("\S")); //false 3 p("a_8".matches("\w{3}")); //true 4 p("abas123&*^".matches("[a-z]{1,4}\d+[&*^%]+")); //true 5 p("\".matches("\\")); //true
3、边界匹配器
^ | 行的开头 |
$ | 行的结尾 |
单词边界 | |
B | 非单词边界 |
A | 输入的开头 |
G | 上一个匹配的结尾 |
输入的结尾,仅用于最后的结束符(如果有的话) | |
z | 输入的结尾 |
举例:
1 p("hello sir".matches("^h.*")); //true 2 p("hello sir".matches(".*ir$")); //true 3 p("hello sir".matches("^h[a-z]{1,3}o\b.*")); //true 4 //空白行处理 5 p(" ".matches("^[\s&&[^\n]]*\n")); //true
4、分组(group)
对于比较复杂的模式,可以利用分组来使匹配字符串时更加灵活,正则表达式本身可以视为零号分组,然后利用小括号来增加1号分组,2号分组等。
举例:
1 Pattern p = Pattern.compile("(\d{3,5})([a-z]{2})"); //模式增加两个分组 2 String s = "123aa-456bb-789cc-00"; 3 Matcher m = p.matcher(s); 4 while(m.find()) { 5 p(m.group()); 6 } 7 m.reset(); 8 while(m.find()) { 9 p(m.group(1)); 10 } 11 m.reset(); 12 while(m.find()) { 13 p(m.group(2)); 14 }
输出结果为:
123aa
456bb
789cc
123
456
789
aa
bb
cc
5、字符替换(replacement)
在给定的字符串中,利用匹配器找到匹配的字符串,然后替换为指定的字符串。
举例:
1 Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE); 2 Matcher m = p.matcher("java Java JAva i like JaVa yes ok!"); 3 StringBuffer buf = new StringBuffer(); 4 int i = 0; 5 while(m.find()) { 6 i ++; 7 if(i%2 == 0) { 8 m.appendReplacement(buf, "java"); 9 } else { 10 m.appendReplacement(buf, "JAVA"); 11 } 12 } 13 m.appendTail(buf); 14 p(buf);
输出结果:
JAVA java JAVA i like java yes ok!