if 忘了,please 看一下
1 import java.util.regex.Matcher;
2 import java.util.regex.Pattern;
3
4 import org.junit.Test;
5
6 /**
7 * Regular Expressions
8 * Test jdk 1.7.0_80 64Bit
9 */
10 public class RegExp {
11
12 @Test // Pattern,Matcher
13 public void test1(){
14 p("abc".matches("...") );
15 p("a3323d".replaceAll("d","-") );
16 p("a3323d".replaceFirst("d","-") );
17
18 //a-z 的字母,恰好出现3次
19 Pattern p = Pattern.compile("[a-z]{3}"); //先编译模式,以后匹配速度会快;现场编译的话,速度没那么快
20 Matcher m = p.matcher("dce"); //匹配后的结果存放在Matcher中,Matcher叫做匹配器
21 p( m.matches() ); //true,matches()表示是否匹配整个字符串
22
23 "dec".matches("[a-z]{3}"); //3句话的效率比这一句话的效率高
24 p("decd".matches("[a-z]{3,}") );//true,至少3次
25 p("decd".matches("[a-z]{3,4}") );//true,至少3次,不超过4次,即:{}包含两端3到4次
26 p("decd5".matches("[a-z]{3,4}") );//false,不超过4次
27 p("23423435435".matches("d{3,100}") ); //true
28 }
29
30 @Test //. * + ?,英文叫做meta character,
31 public void test2(){
32 p("a".matches(".") );//1个任意字符(不匹配换行符 rn)
33 p("n".matches(".")); //false
34 p("r".matches(".")); //false
35 p("rn".matches(".."));//false
36 p("rn".matches("rn")); //true
37
38 Pattern p = Pattern.compile("..",Pattern.DOTALL); //让 . 匹配所有字符
39 p.matcher("rn").matches(); //true
40
41 p("--------------*");
42 p("aa".matches("aa") );
43 p("aa".matches("aa*") );//true,0次或者多次,只是针对单个字符a, aa*:第二个a出现0次或多次
44 p("aa".matches("a*") );//true,这里是1次
45 p("aa".matches("aaa*") );//true,这里是0次
46 p("aa".matches("aaaa*") );//false
47 p("".matches("a*")); //true
48
49 p("-------------+");
50 p("aaaa".matches("a+") );//true,1次或者多次
51 p("aa".matches("a+") );//true
52 p("aa".matches("aa+") );//true, aa+:第二个a出现1次或多次
53 p("aa".matches("aaa+") );//false
54 // p("aa".matches("+") ); //编译会错误
55 p("abcd".matches(".+") );//ture
56
57 p("-------------?");
58 p("a".matches("a?") );//ture,0个or 1个
59 p("".matches("a?") );//ture
60 p("ab".matches("a?") );//false
61 p("aaaa".matches("a?") );//false,2007年尚学堂一版jdk,这里是ture,应该是bug
62 p("ab".matches("a.?") );//true,a.? a然后是任意0个或1个
63
64 p("-------------[]");
65 p("192.168.80.201".matches("d{1,3}.d{1,3}") ); //true
66 p("192.168.80.201".matches("d{1,3} . d{1,3}") ); //false 不能空格,空格也是位置:s
67 p("299".matches("[1-2][0-9][0-9]"));//true 包含前后边界
68 p("100".matches("[1-2][0-9][0-9]"));//true
69 }
70
71 @Test //范围 []中匹配的是一个字符
72 public void test3(){
73 p("a".matches("[abc]")); // [abc] 代表中挂号的某一个字母,匹配的是一个字符,而不是abc全部
74 p("c".matches("[^abc]")); //false []中的^ 表示除了abc 其他字母都可以
75 p("d".matches("[^abc]")); // true
76 p("de".matches("[^abc]")); // false
77 p("dA".matches("[^abc][a-zA-Z]")); // true
78 p("dA".matches("[^abc]([a-z]|[A-Z])") ); // true,等价于上面的写法,用了() 和 |
79 p("dA".matches("[^abc][a-z[A-Z]]") ); // true,等价于上面的写法
80 p("R".matches("[A-Z&&[RPC]]") ); // true
81 }
82
83 @Test // s w S W d D
84 public void test4(){
85 p(" nrt".matches("s{4}")); //true
86 p(" ".matches("S")); //false
87 p("".matches("S")); //false
88 p("a_0".matches("w{3}"));
89 p("abc999&^#%".matches("[a-z]{1,3}d+[&^#%]+") );
90 // p("".matches("")); //运行报错,前面"" 是1个 ,java中匹配一个,需要\,需要仔细体会下
91 p("".matches("\"));
92 }
93
94 @Test //边界
95 public void test5(){
96 p("hello sir".matches("^he.*") ); //true. ^在[]里边代表取反,在外边表示 开头
97 p("hello sir".matches(".*r$") ); //true
98 p("hello sir".matches("^h[a-z]{1,3}ob.*") ); //true
99 p("hell osir".matches("^h[a-z]{1,3}bo.*") ); //false
100 p("hell osir".matches("^h[a-z]{1,3}bs+o.*") ); //true,b单词边界仅仅表示边界,并不占位,仍然需要加s
101
102 p("----------white line");
103 p(" rn".matches("^s*$"));
104 p(" rn".matches("^[s&&[^n]]*n$")); //开头是空白字符,但不是换行符
105 p("rn".matches("^[s&&[^n]]*[n|r]$"));
106 p("r".matches("^[s&&[^n]]*[n|r]$"));
107 p("n".matches("^[s&&[^n]]*[n|r]$")); //通常做匹配都是$BufferReader.readLine 这里读出来的行,这里的行是不包含终止符的
108
109 p("------------------b");
110 p("aaa 8888c".matches(".*d{4}.")); //true
111 p("aaa 8888c".matches(".*bd{4}.")); //true
112 p("aaa 8888c".matches(".*bsd{4}.")); //true
113 p("aaa 8888c".matches(".*sbd{4}.")); //true
114 p("aaa 8888c".matches("a{3}bd{4}.")); //这里就是false,需要s
115 p("aaa 8888c".matches("a{3}bsd{4}.")); //true
116 p("aaa 8888c".matches("a{3}b.d{4}.")); //true
117 p("aaa 8888c".matches("a{3}.bd{4}.")); //true
118
119 p("---------------email");
120 p("[email?protected]".matches("[w[.-]][email?protected]w+.w+")); // .在[]中就表示字符,不需要转义
121 p("[email?protected]".matches("[w[.-]][email?protected]w+.w+")); // 加上也是正确的
122 p("[email?protected]".matches("[w[.-]][email?protected][w[.-]]+.w{2,4}"));
123 p("[email?protected]".matches("[w[.-]][email?protected][w[.-]]+.(cc|com|net|cn|so)$"));
124 }
125
126 @Test //matcher
127 public void test6(){
128 Pattern p = Pattern.compile("d{3,5}");
129 String s = "123-23432-789-98";
130 Matcher m = p.matcher(s);
131 p(m.matches() ); //cursor走到第4个位置时,发现已经不匹配,返回结果,cursor依然停在第4个位置,重新find()子串时需要reset
132 m.reset();
133 p(m.find() );
134 p(m.start()+" - "+m.end() );//获取位置
135 p(m.find() );
136 p(m.start()+" - "+m.end() );
137 p(m.find() );
138 p(m.start()+" - "+m.end() );
139 p(m.find() );
140 }
141
142 @Test //Pattern 编译时忽略大小写 & replace
143 public void test7(){
144 // Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
145 Pattern p = Pattern.compile("(?i)java"); //与上面的等价 (?i)是non-caputuring的表示方式
146
147 Matcher m = p.matcher("java iLoveJaVa JAVaa he hate JAVA cef");
148 while(m.find() ){
149 p( m.group() );
150 }
151 /* output:
152 java
153 JaVa
154 JAVa
155 JAVA */
156
157 p(m.replaceAll("PYTHON") ); //PYTHON iLovePYTHON PYTHONa he hate PYTHON cef
158
159 //单数替换成PYTHON,双数替换成python
160 m.reset();
161 StringBuffer buf = new StringBuffer();
162 int i=0;
163 while(m.find() ){
164 i++;
165 if(i%2==0){
166 m.appendReplacement(buf,"python");
167 }else{
168 m.appendReplacement(buf,"PYTHON");
169 }
170 }
171 m.appendTail(buf);
172 p(buf); //PYTHON iLovepython PYTHONa he hate python cef
173 }
174
175 @Test // group
176 public void test8(){
177 Pattern p = Pattern.compile("(d{3,5})([a-z]{2})");
178 String s = "123ab-23432cd-789er-98s";
179 Matcher m = p.matcher(s);
180 while(m.find() ){
181 p(m.group(1) ); //分组怎么看,整个一组是0,m.group(0) == m.group(); 从左边看第1个( 就是第1组,第2个就是第二组
182 /* 123
183 23432
184 789 */
185 }
186 }
187
188 @Test //quantifiers
189 public void test9(){
190 //默认: greedy quantifier 一口吞10个,一看不符合然后慢慢吐
191 /* Pattern p = Pattern.compile("(.{3,10})[0-9]");
192 String s = "aaaa8bbbb9";
193 Matcher m = p.matcher(s);
194 while(m.find() ){
195 p( m.group(0) );
196 }*/
197
198 //Reluctant quantifier 不情愿的,懒懒的,吃最少的,先吃3个看看符不符合,不行再吃
199 Pattern p = Pattern.compile("(.{3,10}?)[0-9]");
200 String s = "aaaa8bbbb9";
201 Matcher m = p.matcher(s);
202 while(m.find() ){
203 p( m.group() );
204 }
205 }
206
207 @Test //non-capturing group,
208 public void test10(){
209 /* Pattern p = Pattern.compile(".{3}(?=a)"); //以a结尾,但是不捕获,Perl程序员喜欢这么搞,需要读懂,有替代方案
210 String s = "9x7za8bbbb9";
211 Matcher m = p.matcher(s);
212 while(m.find() ){
213 p( m.group() ); //output: x7z
214 }*/
215
216 Pattern p = Pattern.compile("(?=a).{3}"); // lookahead,放在前面包含a
217 String s = "9x7za8bbbb9";
218 Matcher m = p.matcher(s);
219 while(m.find() ){
220 p( m.group() ); //output: a8b
221 }
222 }
223
224 @Test //引用
225 public void test11(){
226 Pattern p = Pattern.compile("(dd)1"); //向前引用 1 表示 现在的位置必须和前面的一样
227 String s = "1212";
228 Matcher m = p.matcher(s);
229 p(m.matches() ); //true
230
231 p("122".matches("(d(d))2") ); //true 2表示第2组
232 p("134".matches("(d(d))2") ); //false 2表示第2组和当前位置的“内容”完全一样,而不仅仅指类型一样
233
234 }
235
236 public static void p(Object o){
237 System.out.println(o);
238 }
239
240 }