public class Test2 { public static void main(String[] args) { // 简单认识正则表达式的概念 /* * p("abc".matches("...")); p("a8729a".replaceAll("//d", "-")); Pattern * p = Pattern.compile("[a-z]{3}"); Matcher m = p.matcher("fgh"); * p(m.matches()); p("fgha".matches("[a-z]{3}")); */ // 初步认识. * + ? /* * p("a".matches(".")); p("aa".matches("aa")); p("aaaa".matches("a*")); * p("aaaa".matches("a+")); p("".matches("a*")); * p("aaaa".matches("a?")); p("".matches("a?")); p("a".matches("a?")); * p("214523145234532".matches("//d{3,100}")); * p("192.168.0.aaa".matches( * "//d{1,3}//.//d{1,3}//.//d{1,3}//.//d{1,3}")); * p("192".matches("[0-2][0-9][0-9]")); */ // 范围 /* * p("a".matches("[abc]")); p("a".matches("[^abc]")); * p("A".matches("[a-zA-Z]")); p("A".matches("[a-z]|[A-Z]")); * p("A".matches("[a-z[A-Z]]")); p("R".matches("[A-Z&&[RFG]]")); */ // 认识/s /w /d / /* * p(" /n/r/t".matches("//s{4}")); p(" ".matches("//S")); * p("a_8".matches("//w{3}")); * p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+")); * p("//".matches("")); */ // POSIX Style // p("a".matches("//p{Lower}")); // boundary /* * p("hello sir".matches("^h.*")); p("hello sir".matches(".*ir$")); * p("hello sir".matches("^h[a-z]{1,3}o//b.*")); * p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //whilte lines * p(" /n".matches("^[//s&&[^//n]]*//n$")); * * p("aaa 8888c".matches(".*//d{4}.")); * p("aaa 8888c".matches(".*//b//d{4}.")); * p("aaa8888c".matches(".*//d{4}.")); * p("aaa8888c".matches(".*//b//d{4}.")); */ // email // p("asdfasdfsafsf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+")); // matches find 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()); p(m.start() + "-" + m.end()); p(m.find()); * p(m.start() + "-" + m.end()); p(m.find()); p(m.start() + "-" + * m.end()); p(m.find()); //p(m.start() + "-" + m.end()); * p(m.lookingAt()); p(m.lookingAt()); p(m.lookingAt()); * p(m.lookingAt()); */ // replacement /* * Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE); * Matcher m = * p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf"); * StringBuffer buf = new StringBuffer(); int i=0; while(m.find()) { * i++; if(i%2 == 0) { m.appendReplacement(buf, "java"); } else { * m.appendReplacement(buf, "JAVA"); } } m.appendTail(buf); p(buf); */ // group /* * Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})"); String s = * "123aa-34345bb-234cc-00"; Matcher m = p.matcher(s); while(m.find()) { * p(m.group()); } */ // qulifiers修饰限定 有三种 贪婪( Greedy quantifiers 默认使用) 勉强(Reluctant // quantifiers) 和独占 (Possessive quantifiers) // 独占于贪婪的区别是(以下例) // 独占: 吞进去10个字符( ".{3,10}+[0-9]" 最多区配9+1个字符,故吞10个字符 )看匹不匹配,配则结束,不配也结束 // 贪婪 :吞进去10个字符( ".{3,10}+[0-9]" 最多区配9+1个字符,故吞10个字符 )看匹不匹配 ,配则结束 // ,不配则吐出最后一个 // 字符,看剩下的(8+1)个字符,依次类推 // 勉强 : 吞进去4个字符( ".{3,10}?+[0-9]" (注意此处的问号,) 最少匹配3+1个字符,故吞4个字符 // )看匹不匹配,配则结束,不配再多吞一个字符 /* * Pattern p = Pattern.compile(".{3,10}+[0-9]"); String s = * "aaaa5bbbb68"; Matcher m = p.matcher(s); if(m.find()) p(m.start() + * "-" + m.end()); else p("not match!"); */ // // Special constructs (non-capturing) : // (?:X) X, as a non-capturing group // (?idmsux-idmsux) Nothing, but turns match flags on - off // (?idmsux-idmsux:X) X, as a non-capturing group with the given flags // on - off // (?=X) X, via zero-width positive lookahead () // (?!X) X, via zero-width negative lookahead // (?<=X) X, via zero-width positive lookbehind // (?<!X) X, via zero-width negative lookbehind // (?>X) X, as an independent, non-capturing group // non-capturing groups(不捕获的组 格式 :小括号里以?打头() // ,也就是说这个小括号里的组不会被包含在group()的返回值里,而只是作为一个判断条件 // ".{3}a" 与 ".{3}(?=a)" 的区别在于 前者去匹配cccaddd 会 返回ccca 而后者却只会返回ccc // 而不会包括字母a (?=a)表示返回的 // .{3} 的后面必须紧跟着一个字母a 这样的 .{3} 才会被返回 // 一般 (?) 会放在 .{3} 之类的后面,但如果 放在前面 // 即 "(?=a).{3}" 去匹配cccaddd却仅返加 add (表示第一个字母匹配a,总共的长度为3) 效果与a.{2} 同 // // (?=a)放在 .{3} 的后面,则它不会被包含在.{3} 中的字符中 , // 而(?=a)放在 .{3} 前面却表示 .{3} // 三个字符当中的第一个字符匹配a,后两个字符随意, 意与(a.{2}) 同 // 这就是lookahead 可以看出(?=x) 都是匹配头部 ,当它在后面的时候,它属于下一部分的头部,所以不包括在此部分中 // 而当它在前部时, 它就是此部的头部 ,所以包括在此部分中 // lookback 时,即 // (?<=X) X, via zero-width positive lookbehind // (?<!X) X, via zero-width negative lookbehind // (?<=X) 表示 .{3}(?<=a) 匹配444abbbddd 返回 44a (表示所匹配的结尾必须是a 等同于.{2}a ) // (?<!X) 表示 .{3}(?<!a) 匹配444abbbddd 返回 444 abb bdd (表示所匹配的结尾必须不是a // 等同于.{2}[^a] ) // 放在前面时 (?<=a).{3} 匹配44abbbddd 返回bbb 返回字符串的前面(不是前部) 必须是a // 放在前面时 (?<!a).{3} 匹配44abbbddd 返回44a bbd 返回字符串的前面(不是前部) 必须不是a // ) /* * Pattern p = Pattern.compile(".{3}(?=a)"); String s = "444a66b"; * Matcher m = p.matcher(s); while(m.find()) { p(m.group()); } */ // back refenrences 向前引用 // (//d(//d))//2 : (//d(//d)) 表示匹配一个2位数 //2表示第三位(//2放在第三个位置上) // 数必须和第二个左小括号对应的组相同,此处也谅是第二第三位的数必须相同 // (//d(//d))//2" 匹配122 133 144 255 但不匹配121 /* * Pattern p = Pattern.compile("(//d(//d))//2"); String s = "122"; * Matcher m = p.matcher(s); p(m.matches()); */ // flags的简写 //(?i) 表示 大小写不敏感 ,也是非捕获组(none-capturing) // Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE); p("Java".matches("(?i)(java)")); } public static void p(Object o) { System.out.println(o); } }