Regex 与表达式匹配的模式,该表达式不';t以特定的顺序结束

Regex 与表达式匹配的模式,该表达式不';t以特定的顺序结束,regex,regex-negation,regex-lookarounds,Regex,Regex Negation,Regex Lookarounds,我需要一个正则表达式模式,它匹配不以这样的序列结尾的字符串: \.[A-z0-9]{2,} 我的意思是,被检查的字符串的末尾不能有一个点序列,然后是两个或更多的字母数字字符。 例如,字符串 /home/patryk/www 而且 /home/patryk/www/ 应匹配所需的图案和 /home/patryk/images/DSC002.jpg不应。 我想这与lookarounds(lookaheads)有关,但我仍然不知道如何做到这一点。 感谢您的帮助。旧答案 如果您的正则表达式风格支持,则可

我需要一个正则表达式模式,它匹配不以这样的序列结尾的字符串:
\.[A-z0-9]{2,}
我的意思是,被检查的字符串的末尾不能有一个点序列,然后是两个或更多的字母数字字符。 例如,字符串
/home/patryk/www
而且
/home/patryk/www/
应匹配所需的图案和
/home/patryk/images/DSC002.jpg
不应。 我想这与lookarounds(lookaheads)有关,但我仍然不知道如何做到这一点。
感谢您的帮助。

旧答案

如果您的正则表达式风格支持,则可以在末尾使用负查找:

^.*+(?<!\.\w{2,})$
在对答案的评论中,您已经声明您不希望在字符串末尾使用正斜杠来匹配字符串,这可以通过简单地将正斜杠添加到前瞻中来实现

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

请注意,为了简洁起见,我使用了
\w
,但它允许下划线通过。如果这很重要,您可以将其替换为旧答案

如果您的正则表达式风格支持,则可以在末尾使用负查找:

^.*+(?<!\.\w{2,})$
在对答案的评论中,您已经声明您不希望在字符串末尾使用正斜杠来匹配字符串,这可以通过简单地将正斜杠添加到前瞻中来实现

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

请注意,为了简洁起见,我使用了
\w
,但它允许下划线通过。如果这很重要,您可以将其替换为Asad的版本非常方便,但只有.NET的regex引擎支持可变长度lookbehinds(这是每个regex问题都应该包含所用语言或工具的众多原因之一)

如果我们考虑应该匹配的可能情况,我们可以将其减少到固定长度的lookbehind(除了JavaScrpit之外,大多数引擎都支持这种方法)。这可能是结尾处的一个或零个字母/数字(无论前面是否有
),或者前面没有点的两个或多个字母/数字

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

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

如果我们考虑应该匹配的可能情况,我们可以将其减少为固定长度的查找(除了JavaScrpit之外,大多数引擎都支持这种查找)。这可能是结尾处的一个或零个字母/数字(无论前面是否有
),或者两个或多个不带点的字母/数字

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

^.*(?可变长度look behind很少受支持,但您不需要:

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

^.*(可变长度look behind很少受支持,但您不需要:

^.*(?<!\.[A-z0-9][A-z0-9]?)$
^.*(这应该可以做到:

^(?:[^.]+|\.(?![A-Za-z0-9]{2,}$))+$
它在匹配一个或多个除点之外的任何内容之间进行交替,或者如果一个点后面没有两个或多个字母数字字符以及字符串的结尾,则匹配该点

编辑:升级它以满足新的要求更是如此:

^(?:[^./]+|/(?=.)|\.(?![A-Za-z0-9]{2,}$))+$
分解这一点,我们有:

  • [^./]+
    #除
    /

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

  • \(?![A-Za-z0-9]{2,}$)
    \一个点,除非后面跟两个或多个字母数字字符,后面跟在字符串末尾


另请注意:
[A-z]
是一个错误。
它匹配所有大小写ASCII字母,但也匹配字符
[
]
^
,反斜杠和反勾号,其代码点恰好位于
Z
a
之间,这应该可以做到:

^(?:[^.]+|\.(?![A-Za-z0-9]{2,}$))+$
它在匹配一个或多个除点之外的任何内容之间进行交替,或者如果一个点后面没有两个或多个字母数字字符以及字符串的结尾,则匹配该点

编辑:升级它以满足新的要求更是如此:

^(?:[^./]+|/(?=.)|\.(?![A-Za-z0-9]{2,}$))+$
分解这一点,我们有:

  • [^./]+
    #除
    /

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

  • \(?![A-Za-z0-9]{2,}$)
    \一个点,除非后面跟两个或多个字母数字字符,后面跟在字符串末尾



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

之间,你真的意思是“匹配(完整/完整)字符串”或“匹配子字符串”"?我的意思是匹配整个字符串,即,
/home/me/public/
匹配,而
/home/me/images/DSC001.jpg
不匹配。这实际上揭示了我的目的,但我仍然想知道。您是否可以添加一组测试字符串和匹配项?是否可以依赖最后一个正斜杠?嗯,我希望这两个都与最后是e斜杠,没有它来匹配模式。但是如果不是,这会简化解决方案吗?你真的是指“匹配(完整/完整)字符串”还是“匹配子字符串”?我的意思是匹配整个字符串,即,
/home/me/public/
匹配,而
/home/me/images/DSC001.jpg
不匹配。这实际上揭示了我的目的,但我仍然想知道。您是否可以添加一组测试字符串和匹配项?是否可以依赖最后一个正斜杠?嗯,我希望这两个都与e在结尾处斜线,没有斜线以匹配图案