加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 RegularExpressions

发布时间:2020-12-14 06:13:30 所属栏目:百科 来源:网络整理
导读: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
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 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读