0
0

正则表达式中的不匹配

isnowfy 发表于 2013年12月22日 16:47 | Hits: 1836
Tag: program | re | 正则

regular_expressions

昨天在hacker news上看到regex golf,这里可以做几道很有趣的正则表达式的题,做题过程中有的需要用到不匹配这种匹配,比如说我需要匹配不包含某个单词的串。

先来看看正则表达式的语法吧。

[abc]a或b或c .任意单个字符 a?零个或一个a
[^abc]任意不是abc的字符 \s空格 a*零个或多个a
[a-z]a-z的任意字符 \S非空格 a+一个或多个a
[a-zA-Z]a-z或A-Z \d任意数字 a{n}正好出现n次a
^一行开头 \D任意非数字 a{n,}至少出现n次a
$一行末尾 \w任意字母数字或下划线 a{n,m}出现n-m次a
(...)括号用于分组 \W任意非字母数字或下划线 a*?零个或多个a(非贪婪)
(a|b)a或b \b单词边界 (a)...\1引用分组
(?=a)前面有a (?!a)前面没有a \B非单词边界

我们看到,正则表达式中有(?=a)和(?!a)来表示我们是否需要匹配某个东西。

所以我们有需要不匹配某样东西的时候我们就可以用(?!a)了。比如说我们要匹配不含hello的字符串就可以这样写。

^(?!.*hello)

这里.*用来表示hello之前可能有其他的字符,为什么还要加^呢,因为如果不加的话,可能匹配到h之后的这个位置上了。

我们现在就可以解决regex golf上的abba这道题了。这道题是让我们去匹配不含abba这种形式的单词,比如abba,anallagmatic就不应该匹配上。所以这道题只需要这样就可以了。

^(?!.*(.)(.)\2\1)

然后利用不匹配,我们还可以解决prime这道题,这道题是让我们匹配有素数个x的串,先看正则。

^(?!(xx+)\1+$)

(xx+)是匹配2个及2个以上的x,(xx+)\1+就是匹配重复出现2个及以上的串,所以(xx+)\1+就表示了那些非素数的串,那么素数串就是除去这些非素数串,就是上面这个正则表达式了。

话说regex golf上面还有道题,需要利用自动机来转成正则,有兴趣的可以看这篇文章。
我猜您可能还会喜欢:

原文链接: http://www.isnowfy.com/regular-expression-negative/

0     0

评价列表(0)