【问题标题】:How do I invert the results of my RegEx如何反转我的 RegEx 的结果
【发布时间】:2017-11-13 06:08:45
【问题描述】:

我有以下正则表达式

.*\.(test|spec|es5|es6)\.(js|bundle\.js)

使用以下测试输入

bunle.spec.js
my.main.js
test.es6.js
te.es5.js
file.test.js
abc.js
ee.ff.abc.js
eeee.ffff.abc.js

https://regex101.com/r/8BZyA0/2

我如何翻转我的 RegEx 条件,所以它会选择 my.main.jsabc.jsee.ff.abc.jseeee.ffff.abc.js 代替?

谢谢

【问题讨论】:

  • 使用否定断言很容易说出你不想要什么,但你必须将它与你想要的形式结合起来。如果你不结合有效的形式,你会得到任何东西。

标签: javascript regex regex-negation


【解决方案1】:

您需要将模式的第一部分转换为负前瞻并将其锚定在字符串的开头,并且 - 根据 cmets 中的反馈 - 您需要字符串以 .js 结尾或.bundle.js - 在末尾添加 $ 锚点:

 ^(?!.*\.(?:test|spec|es[56])\.(?:(?:bundle\.)?js$)).*\.(?:bu‌​ndle\.)?js$

请参阅regex demo

详情

  • ^ - 字符串的开头
  • (?!.*\.(?:test|spec|es[56])\.(?:(?:bundle\.)?js$)) - 如果在除换行符之外的 0+ 个字符之后(由于.*)字符串包含. 后跟test、@987654332,则将导致匹配失败@、es5es6 后跟.,然后在字符串末尾jsbundle.js ($)
  • .* - 除换行符以外的 0+ 个字符
  • \. - 一个点
  • (?:bu‌​ndle\.)? - 一个可选的非捕获组,匹配 1 次或 0 次出现的 bundle. 子字符串
  • js - 文字子字符串 js
  • $ - 在字符串的末尾。

【讨论】:

  • 非常感谢。我正在尝试.*\.(?!test|spec|es5|es6)\.(js|bundle\.js).*\.(?!(?:test|spec|es5|es6))\.(js|bundle\.js),但没有成功。我不知道为什么。
  • 它们不起作用,因为您在 \.(js|bundle\.js) 模式之前使用了负前瞻,从而限制了它们。但是,这些前瞻始终返回 true,因为第一个消费模式是 \.(文字点),它不等于 tse
  • 哦,所以为了阻止负前瞻查看以下模式,我们需要在那里使用捕获组,对吗?
  • 不,前瞻应该是anchored,并且它的模式必须能够到达禁止模式。在我的解决方案中,^ 使前瞻锚定在字符串的开头(=它将在字符串的开头执行一次),然后.* 将匹配所有行直到其结尾,然后将发生回溯,并且每当引擎在行首的任何地方找到\.(?:test|spec|es[56])\.(?:(?:bundle\.)?js匹配时,前瞻将导致匹配失败。
  • 也许,你想匹配字符串末尾有.js.bundle.js,而不是前面有.test.spec.es5es6的字符串?然后使用^(?!.*\.(?:test|spec|es[56])\.(?:(?:bundle\.)?js$)).*\.(?:bundle\.)?js$
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多