无字符串正则表达式匹配技巧
通常,当我们想要找到不包含某个字符串的文本时,程序员最有可能想到的是在正则表达式中使用,(hede)来过滤“hede”字符串,但这种写法是错误的。我们可以这样写:【hede】,但是这个正则表达式还有另外一个意思,就是字符串不能包含三个但是字符,‘h’、‘e’和‘d’。什么样的正则表达式可以过滤掉不包含完整“hello”字符串的信息?
事实上,说正则表达式不支持反向匹配并不是100%正确的。就像这个问题一样,我们可以用负搜索来模拟反向匹配,从而解决我们的问题:复制代码如下:(?Hede)。)*$上面的表达式可以过滤掉不包含字符串“hede”的信息。我上面说了,这个写法不是正则表达式“擅长”的用法,但是可以这样用。
解释
一个字符串由n个字符组成。每个字符前后都有一个空字符。这样,一个由n个字符组成的字符串有n 1个空字符串。让我们看看字符串“ABhedeCD”:
E数的所有位置都是空字符。表达式(?Hede)。会期待看看前面有没有“hede”的弦。如果没有(其他字符),那么。(点)将匹配这些其他字符。这个正则表达式的“搜索”也叫“零宽度断言”,因为它不会捕获任何字符,只是判断。
在上面的例子中,每个空字符将检查它前面的字符串是否不是“hede”。如果没有,这个。(点)就是匹配并捕捉这个字符。表达式(?Hede)。它只执行一次,所以我们用括号将这个表达式包装成一个组,然后用*(星号)修改——,使其匹配0次或更多次:复制代码如下:((?hede)。)*。可以理解,正则表达式((?Hede)。)*匹配字符串“ABhedeCD”的结果为假,因为在e3位置,(?Hede)匹配失败,它前面有“hede”字符串,也就是说,它包含指定的字符串。
在正则表达式中,它帮助我们解决了字符串“不包含”匹配的问题。
以下是一些补充:
分享php生成随机数的三种方法,生成1到10之间的非重复随机数,php生成非重复随机数。请参考你的朋友。
参见黑客新闻上的regex golf,一些有趣的正则表达式问题,还有一些需要使用不匹配匹配,比如匹配不包含某个单词的字符串。
在进入正题之前,让我们看一下正则表达式的语法:
A或B或c。任何单个字符A?零或一个A [abc]任何不是abc的字符空格a*零或多个任意字符a[a-z] a-z \S非空格A一个或多个a[a-zA-Z] a-z或A-Z \d任何数字a{n}出现N次A在行首\d任何非数字W任何字母数字或下划线a{n,m}出现n-m次A(.)括号用于分组\W任何非字母数字或下划线a*?零个或多个a(非贪婪)(a|b) a或b \b单词边界(a).\1参考分组(?=a)前面有一个(?a)前面没有a \B非字边界
有(?=a)和(?a)表明我们是否需要匹配某些东西。
因此,当有需要不匹配的东西时,可以使用(?a)。例如,要匹配一个没有hello的字符串,可以这样写。
复制代码如下:(?*您好)
给你。*用于表示hello前可能还有其他字符,那么为什么要加上呢,因为如果没有加上的话,可能会和h后的这个位置匹配。
现在我们可以解决regex高尔夫的abba问题了。这个问题是匹配没有阿爸的词,比如阿爸,不应该匹配。
正则表达式代码:
复制代码如下:(?*(.)(.)\2\1)
然后,利用不匹配,我们也可以解决质数的问题,质数匹配一个质数为x的字符串,所以首先要看正则性。复制代码如下:(?(xx )\1 $)
(xx)匹配两个或多个x,(xx )\1匹配两个或多个重复出现的字符串,所以(xx )\1代表那些不是质数的字符串,所以质数字符串就是去掉这些非质数的字符串,这就是上面的正则表达式。
PS:关于规律性,这个网站还提供了两个非常简单实用的规律性测试工具,大家都可以使用:
JavaScript正则表达式在线测试工具:http://tools.jb51.net/regex/javascript
在线正则表达式生成工具:http://tools.jb51.net/regex/create_reg
版权声明:无字符串正则表达式匹配技巧是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。