一个简单的Perl正则表达式,保证永远不会匹配到任何字符串?

9

可能是重复的问题:
一个永远不会被任何内容匹配的正则表达式

我有一个接受正则表达式作为参数的脚本。默认情况下,我想将正则表达式设置为永远不会匹配任何字符串的内容,这样我就可以简单地说

if ($str =~ $regex)

无需先检查defined($regex),即可进行操作。

我想到了

qr/[^\s\S]/

但是我不知道这是否会匹配一些既不是空格也不是非空格的utf8字符。

3个回答

20

MJD的解决方案比这里或所谓的重复问题中提供的任何其他解决方案都要好,因此值得保留。 - tchrist
@tchrist:从我狭隘的角度来看,MJD写的几乎任何东西都是纯金。这个人就像是Perl的炼金术士一样。 - Hugmeir
阐明一下:空模式//(?:)不会断言任何内容,因此总是匹配。(?!)是一个针对空模式的负向先行断言(!)之间的内容是断言的主体),因此永远无法匹配。 - hobbs
@hobbs:吹毛求疵:// 可以匹配某些内容;它是特殊的空模式,如果上次有匹配的正则表达式,则会重用该正则表达式... :( - Hugmeir
@Hugmeir 是的,我不是指那个 //,但我想这有点不清楚 :) - hobbs

5

结合负向先行断言和任意字符后跟该字符的匹配,例如:

/(?!x)x/

我测试了所有的测试用例,都能正常工作。以下是一些在rubular上进行的测试。


4
< p > / ^/ 似乎是最短的,它的作用是匹配字符串的开头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接