2013-06-20 100 views
7

我在过去的几个小时中搜索了网络,试图找出为什么我的一位同事坚持使用(?!.)作为他的正则表达式中的最后一个字符而不是通常的$正则表达式结束

我见过的一些正则表达式一直是^.*.txt(?!.),它们以通常的^开头,但不以$结尾。我一直无法找到任何明确或时间有效的理由,任何利弊或差异呢?

+0

你应该给[TDWTF](http://thedailywtf.com/)一读 – Bojangles

+0

这是一个环顾四周,请参阅http://www.perlmonks.org/?node_id=518444(这意味着没有更多的字符),但当你只想使用'$'时不需要使用它,这是过度的 –

+0

你甚至问过他吗? –

回答

4

$可以匹配端线的,而不是输入的端(此依赖于取决于使用修饰符)。也许这就是原因。

在我看来,匹配输入末尾的最佳方式是\z - 这意味着输入的确切结束,而不管修饰符如何。它在大多数(如果不是全部的话)正则表达式实现中得到支持。

+0

啊,有趣。当我们处理多种平台和多种语言时,我可以看到这是我们系统中的一个问题,所以我认为功能期望很低 - 在语法上要小心。谢谢,我不知道'\ z'。 –

2

^.*\.txt(?!.)表示匹配(开始)(任何0或更多次).txt,并且不会跟随任何内容。

您可以通过?!模式here获取更多信息。

如果你看here,它说使用m或s修饰符,你可以修改^和$的行为来匹配行的开始或结束,而不是整个字符串。还有一个ms。所以,我想用(?!.),你可以匹配整个多行字符串的末尾。

所以,我不会说使用这个更好。相反,我会说你需要知道你正在寻找什么或者你真正打算做什么,在单行字符串或多行字符串中,以及如何解析你的输入以获得单行或多行字符串,然后传入正则表达式。

我想我们很多人在单行字符串上运行正则表达式,因此感觉不到这两种语法之间的区别。

+0

谢谢!我很欣赏搜索,但似乎我们都在找同样的东西 - 没有理由,而我的同事只是一个疯狂的人。你知道是否有任何性能差异? –

+0

用更多的信息更新了我的答案。不知道它是否会自动触发你。 – ruben2020