首页 > 代码库 > 正则有那么难吗?

正则有那么难吗?

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


正则有那么难吗?