如何使用负向前查找(NOT Lookbehind)来匹配在特定位置不包含给定子字符串的字符串?

Wor*_*mon 3 javascript regex safari regex-negation regex-lookarounds

我想将某些文件类型(例如“.txt”)与不以特定子字符串结尾的非空根名称(例如“-bad”)进行匹配。有了消极的后向支持,解决方案很简单:

\n
/.(?<!-bad)\\.txt$/\n
Run Code Online (Sandbox Code Playgroud)\n

然而,Safari仍然不支持负向后查找。啊。如何使用负前瞻获得相同的结果?我想用一个正则表达式来做到这一点。请不要提供任何非正则表达式或多步骤解决方案。

\n

下面的测试代码显示我已经接近了,但一项测试仍然失败。

\n

\r\n
\r\n
/.(?<!-bad)\\.txt$/\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

\n

Car*_*and 5

您可以使用

^(?!.*\-bad\.txt$).+\.txt$
Run Code Online (Sandbox Code Playgroud)

演示1

正则表达式如下:

  • 匹配字符串的开头 ( ^)
  • 使用负前瞻( (?!...)) 来断言字符串不以“-bad.txt”结尾
  • 匹配字符串末尾后跟“.txt”的一个或多个字符。

要同时检查多个文件中的任何一个是否足够(根据下面的评论,这可能会有所帮助),您可以编写,例如:

^(?=.*\.(txt|pdf|csv|docx|html|jpeg)$)(?!.*\-bad\.\1$).+\.\1$
Run Code Online (Sandbox Code Playgroud)

开头的正向先行的唯一目的是捕获字符串末尾的文件后缀,以便可以在负向先行和末尾使用反向引用。

演示2