首页 > 代码库 > 正则有那么难吗?
正则有那么难吗?
1、常规模式
\d 数字字符[0-9] \D 非数字[^0-9]
\s 空白字符[ \t\n\x0B\f\r] \S 非空白[^\s]
\w 单词字符[a-zA-Z_0-9] \W 非单词[^\w]
| 同时匹配多个模式
2、贪婪模式
greedy(贪心的;渴望的;贪婪的)与reluctant(勉强的;厌恶的;非贪婪)
3、条件模式
(?=X) zero-width非捕获 positive肯定的 lookahead 先行
(?!X) zero-width非捕获 negative否认的 lookahead 先行
(?<=X) zero-width非捕获 positive肯定的 lookbehind追溯
(?<!X) zero-width非捕获 negative否认的 lookbehind追溯
模式前后加条件,肯定模式表示匹配某个正则,否定模式表示不匹配某个正则,先行表示欲匹配正则右侧条件,追溯表示欲匹配正则左侧条件。
理解以下代码后再看jdk的Pattern类帮助,应该就比较全面了。
public static void m(String pattern) { String str = "h2do@e4say.com.cn";//所有正则使用同一个字符串测试 System.out.println(str + "匹配正则" + pattern + "的结果:"); Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(str); int i = 1;//匹配结果序号 while(m.find()){ System.out.println(i++ + ") " + m.group()); } } public static void main(String[] args) throws Throwable { //字母开头,24个以内的单词字符,@后面24个以内的单词字符,以.com或.net结尾 m("[a-zA-Z]\\w{3,23}@\\w{1,24}\\.com|[a-zA-Z]\\w{3,23}@\\w{1,24}\\.net"); //匹配结果:h2do@e4say.com //贪婪,最大匹配 m(".+o"); //匹配结果:h2do@e4say.co //懒惰,最小匹配 m(".+?o");//匹配结果:h2do和@e4say.co //前面是h字符 m("(?<=h)\\d");//匹配结果:2 //前面不是h字符 m("(?<!h)\\d");//匹配结果:4 //后面是d字符 m("\\d(?=d)"); //匹配结果:2 //后面不是d字符 m("\\d(?!d)"); //匹配结果:4 //后面不是d字符,并且前面不是h字符 m("(?<!h)\\d(?!d)"); //匹配结果:4 }
h2do@e4say.com.cn匹配正则[a-zA-Z]\w{3,23}@\w{1,24}\.com|[a-zA-Z]\w{3,23}@\w{1,24}\.net的结果:
1) h2do@e4say.com
h2do@e4say.com.cn匹配正则.+o的结果:
1) h2do@e4say.co
h2do@e4say.com.cn匹配正则.+?o的结果:
1) h2do
2) @e4say.co
h2do@e4say.com.cn匹配正则(?<=h)\d的结果:
1) 2
h2do@e4say.com.cn匹配正则(?<!h)\d的结果:
1) 4
h2do@e4say.com.cn匹配正则\d(?=d)的结果:
1) 2
h2do@e4say.com.cn匹配正则\d(?!d)的结果:
1) 4
h2do@e4say.com.cn匹配正则(?<!h)\d(?!d)的结果:
1) 4
正则有那么难吗?