我想将某些文件类型(例如“.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$
正则表达式如下:
- 匹配字符串开头(
^
) - 使用负前瞻 (
(?!...)
) 断言字符串不以“-bad.txt”结尾 - 匹配一个或多个字符,后跟字符串末尾的“.txt”。
要同时检查多个文件是否足够(根据您在下面的评论,这可能会有所帮助)您可以这样写,例如:
^(?=.*\.(txt|pdf|csv|docx|html|jpeg)$)(?!.*\-bad\.\1$).+\.\1$
开头的正先行的唯一目的是捕获字符串末尾的文件后缀,以便可以在负先行和末尾使用反向引用。
关于javascript - 如何使用否定前瞻(NOT lookbehind)来匹配在特定位置不包含给定子字符串的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69469047/