与不以特定序列结束的表达式匹配的模式

时间:2012-11-11 21:52:39

标签: regex regex-negation regex-lookarounds

我需要一个匹配这些字符串的正则表达式模式,这些字符串不会以这样的顺序结束: \.[A-z0-9]{2,} 我的意思是被检查的字符串在其末尾不得有一个点的序列,然后是两个或多个字母数字字符。 例如,一个字符串 /home/patryk/www 并且 /home/patryk/www/ 应符合所需的模式和 /home/patryk/images/DSC002.jpg不应该。 我想这与lookarounds(展望未来)有关,但我仍然不知道如何制作它。 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

旧答案

如果你的正则表达式支持它,你可以在最后使用负面的lookbehind:

^.*+(?<!\.\w{2,})$

这将匹配一个字符串,该字符串的结尾不是,前面是您不想要的icky序列。

请注意,正如m.buettner所指出的,这使用了一个无限长的lookbehind,这是.NET独有的一个特性


新答案

然而,经过一些挖掘后,我发现可变长度look- aheads 得到了广泛的支持,所以这里有一个使用它们的版本:

^(?:(?!\.\w{2,}$).)++$

在对答案的评论中,你已经声明你想要在末尾不要使用正斜杠匹配字符串,这可以通过向前瞻添加正斜杠来实现。

^(?:(?!(\.\w{2,}|/)$).)++$

请注意,我使用\w来表示简洁,但它允许使用下划线。如果这很重要,您可以将其替换为[^\W_]

答案 1 :(得分:1)

Asad的版本非常方便,但只有.NET的正则表达式引擎支持可变长度的lookbehinds(这是为什么每个正则表达式问题应该包括使用的语言或工具的众多原因之一)。

如果我们考虑应该匹配的可能情况,我们可以将其减少到固定长度的lookbehind(大多数引擎都支持,除了JavaScrpit)。那将是一个或零个字母/数字(无论是否以.开头)或两个或多个不以点开头的字母/数字。

^.*(?:(?<![a-zA-Z0-9])[a-zA-Z0-9]?|(?<![a-zA-Z0-9.])[a-zA-Z0-9]{2,})$

答案 2 :(得分:1)

这应该这样做:

^(?:[^.]+|\.(?![A-Za-z0-9]{2,}$))+$

它在匹配除了点之外的任何内容之间交替,或者如果它后面没有两个或多个字母数字字符和字符串的结尾,则交替匹配。

编辑:升级它以满足新要求更多相同:

^(?:[^./]+|/(?=.)|\.(?![A-Za-z0-9]{2,}$))+$

打破这种局面,我们有:

  • [^./]+#除./之外的任何字符中的一个或多个

  • /(?=.)#斜杠,只要其后至少有一个字符

  • \.(?![A-Za-z0-9]{2,}$) #a点,除非后跟两个或更多字母数字字符后跟字符串结尾


另一方面: [A-z]是一个错误。它匹配所有大写和小写ASCII字母,但它也匹配字符[]^_,反斜杠和反引号,其代码点恰好位于Za之间。

答案 3 :(得分:0)

很少支持可变长度的外观,但您不需要:

^.*(?<!\.[A-z0-9][A-z0-9]?)$