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

标签 javascript regex safari regex-lookarounds regex-negation

我想将某些文件类型(例如“.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\.\1$).+\.\1$

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

Demo2

关于javascript - 如何使用否定前瞻(NOT lookbehind)来匹配在特定位置不包含给定子字符串的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69469047/

相关文章:

javascript - 如何使用 axios 编辑和更新页面的 html?

javascript - 有什么办法可以将 "convert"一个 ejs 文件转换为 jade?

javascript - Google Charts 时间线网格 - 更改时间线标签跨度

javascript - 如何从 ipfs-http-client 获取文件内容

jquery , append html

javascript - Jquery 不适用于 Safari

regex - 删除具有特定模式的行

java - 在代码中发现看似毫无意义的正则表达式

android - IOS UIWebView 和 Safari 不发送 If-None-Match 但 Android WebView 和 Chrome 发送

html - Facebook mbasic 站点、移动 safari、主屏幕快捷方式和本地存储