一个永远不会被任何东西匹配的正则表达式
这可能听起来像一个愚蠢的问题,但我与我的一些开发人员进行了长时间的谈话,听起来像是一件有趣的事情。
所以; 你的想法是什么 - 正则表达式看起来像什么,永远不会被任何字符串匹配!
编辑 :为什么我想要这个? 首先,因为我觉得想到这样一种表达方式很有意思,其次是因为我需要一个脚本。
在该脚本中,我将字典定义为Dictionary<string, Regex>
。 如你所见,它包含一个字符串和一个表达式。
基于该字典,我创建了所有使用此字典的方法作为他们应该如何执行工作的参考,其中一个方法将正则表达式与解析的日志文件相匹配。
如果表达式匹配,则另一个Dictionary<string, long>
将添加表达式返回的值。 因此,为了捕获字典中不匹配表达式的日志消息,我创建了一个名为“unknown”的新组。
对这个组添加任何与其他任何不匹配的内容。 但为了防止“未知”表达错误(偶然)一个日志消息,我不得不创建一个绝对不会匹配的表达式,无论我给它什么字符串。
因此,你有这个“不是真正的问题”的理由......
这实际上很简单,虽然它取决于执行/标志*:
$a
在字符串结尾后会匹配一个字符a
。 祝你好运。
警告:
这个表达式很昂贵 - 它会扫描整行,找到行结束符,然后才找到a
并返回否定匹配。 (更多细节见下面的评论。)
*最初我对多行模式正则表达式没有太多的想法,其中$
也匹配一行的结尾。 事实上,就在新行权前的空字符串匹配,所以像一个普通的字符a
可以后不会出现$
。
利用negative lookahead
:
>>> import re
>>> x=r'(?!x)x'
>>> r=re.compile(x)
>>> r.match('')
>>> r.match('x')
>>> r.match('y')
这个RE是矛盾的,因此永远不会匹配任何东西。
注意:
在Python中,re.match()隐式地将字符串开头的锚点( A
)添加到正则表达式的开头。 这个锚对性能很重要:没有它,整个字符串将被扫描。 那些不使用Python的人会希望显式添加锚点:
A(?!x)x
环视四周:
(?=a)b
对于正则表达式新手:前面的正面看法(?=a)
确保下一个字符是a
,但不会更改搜索位置(或者在匹配的字符串中包含'a')。 现在下一个字符被确认为a
,正则表达式( b
)的剩余部分仅在下一个字符是b
匹配。 因此,这个正则表达式只有在一个字符同时a
和b
时才匹配。
上一篇: A Regex that will never be matched by anything
下一篇: How match a regex if it does not contain a particular word?