正则表达式写得好,能够胜过算法

2020-04-29  本文已影响0人  鼾声鼾语

正则表达式为:(?<=左侧的内容).*(?=右侧的内容)
比如:字符串aaabbbcccdddeee,想要获取"ccc"
正则表达式可以参考以下四种示例:

(?<=aaabbb).*(?=dddeee)
(?<=bbb).*(?=dddeee)
(?<=aaabbb).*(?=ddd)
(?<=bbb).*(?=ddd)
如果要包括左右两侧的内容,则可以是:左侧的内容(.*?)右侧的内容
比如上面的字符串要获取bbbcccddd,
正则表达式是:bbb(.*?)ddd

捕获两个字符之间的字符串信息,类似就是AcakeB这个字符串中提取cake。
当时只想到如下的表达式:

A.*B

上述是将以A开头和以B结尾的字符串提取出来,但是本意是不想要有A和B了。通过查资料发现了如下写法

(?<=A).*(?=B)

继续查了一点资料,又学到一点知识。

表达式    描述
(?:pattern) 非捕获匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。
(?=pattern) 非捕获匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,不进行存储供以后使用。
(?!pattern) 非捕获匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,不进行存储供以后使用
(?<=pattern) 非捕获匹配,反向肯定预查,与正向肯定预查类似,但是方向相反。
(?<!pattern) 非捕获匹配,反向否定预查,与正向否定预查类似,但是方向相反。

举例:

String str1 = "5A2118DAF110220D0E0F10111213A5A55A2118DAF1102314FFFFFFFFFFFF44A55A2118DAF1101";
            // String[] strsplit = str1.split("A55A.*");
            String[] strsplit = str1.split("(?=A55A)");        
            for (int i = 0; i < strsplit.length; i++) {
                System.out.println(strsplit[i]);   
            }
            

答案:

5A2118DAF110220D0E0F10111213A5
A55A2118DAF1102314FFFFFFFFFFFF44
A55A2118DAF1101
上一篇 下一篇

猜你喜欢

热点阅读