如何使用否定前瞻(NOT lookbehind)来匹配在特定位置不包含给定子字符串的字符串?

How to use negative lookahead (NOT lookbehind) to match a string that does NOT contain a given substring at a specific position?

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

/.(?<!-bad)\.txt$/

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

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

const regex = /.((?!-bad).{4})\.txt$/;
const tests = [
  ['this-file-bad.txt', false],
  ['this-file.txt', true],
  ['.txt', false],
  ['f.txt', true]
];

const results = tests.map(([input, expected]) => ((regex.test(input) === expected) ? '✅' : '❌') + input);
console.log(results.join('\n'));


您可以使用

^(?!.*\-bad\.txt$).+\.txt$

Demo1

正则表达式如下:

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

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

^(?=.*\.(txt|pdf|csv|docx|html|jpeg)$)(?!.*\-bad\.$).+\.$

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

Demo2