【问题标题】:Regex lookahead. Find word without .min. in string正则表达式前瞻。查找不带 .min 的单词。在字符串中
【发布时间】:2019-06-06 01:39:49
【问题描述】:

我正在尝试用正则表达式和 nodejs 替换 html 文件中的链接。我想替换没有 .min.js 扩展名的链接。

例如,它应该匹配“common.js”而不是“common.min.js”

这是我尝试过的:

let htmlOutput = html.replace(/common\.(?!min)*js/g, common.name);

我认为这种消极的前瞻应该有效,但它不匹配任何东西。任何帮助将不胜感激。

【问题讨论】:

  • 也许只是let htmlOutput = html.replace(/\bcommon\.js\b/g, common.name);(?!min)*js 毫无意义。
  • @WiktorStribiżew 似乎不起作用。
  • @WiktorStribiżew 令人困惑。这一定是另一个阻止比赛的问题。我会看看并回复你。
  • 什么是common.name,顺便说一句?

标签: regex


【解决方案1】:

(?!min)*js 部分已损坏:您不应量化零宽度断言,如前瞻(它们不消耗文本,因此它们之后的量词被视为用户错误或被忽略)。由于js 不以min 开头,因此即使没有量词,这种前瞻也是多余的。

如果你想匹配一个带有整个单词common的字符串,那么你需要任何字符并以.js结尾但不是.min.js

/\bcommon\b(?!.*\.min\.js$).*\.js$/

请参阅regex demo

详情

  • \b - 字边界
  • common - 一个子字符串
  • \b - 字边界
  • (?!.*\.min\.js$) - 紧靠右边,字符串末尾不应有任何 0 个或多个字符后跟 .min.js
  • .* - 任何 0 个或多个字符
  • \.js - .js 子字符串
  • $ - 字符串结束。

【讨论】:

    【解决方案2】:

    在这里,我们可能会找到一个简单的表达式来传递除换行符和. 之外的任何字符,在单词common 之后,然后是.js

    common([^\.]+)?\.js
    

    Demo

    正则表达式电路

    jex.im 可视化正则表达式:

    【讨论】:

      【解决方案3】:

      我使用的结束正则表达式是/\bcommon[^min]+js\b/g

      这将找到与任意数量的字符后缀共同的单词,除非这些字符包含单词 min 并以 js 结尾,允许我替换我的 html 页面上的脚本,例如:

      script src="~/dist/common.js"

      script src="~/dist/common.9cf5748e0e7fc2928a07.js"

      感谢 Wiktor Stribiżew 帮助我。

      【讨论】:

      • 你错了。 \bcommon[^min]+js\b 匹配 common 后跟 1 个或多个字符,而不是 min 后跟 js 子字符串。所以你需要\bcommon(?:(?!min).)*?js\b 我猜,从你的描述来看。或\bcommon\b(?!\S*\.min\.js\b)\S*\.js\b
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2019-04-30
      • 1970-01-01
      • 2022-09-29
      相关资源
      最近更新 更多