【问题标题】:Negative Lookahead with multiple conditions具有多个条件的负前瞻
【发布时间】:2019-02-17 18:58:03
【问题描述】:

我需要提取 $x 而不是 $$x 和 '$x'。

  1. 读取 $$x 无效。请使用 $x。
  2. 您选择了“$x”值作为 $x。

以下正则表达式适用于 1。

\$x(?!$)\

我使用了以下交替(|),显然第二个字符串失败了。

\$x(?!$)|\$x(?!\')\

如何检查多个负前瞻?

P.S:应该与 Javascript Regex 兼容。

【问题讨论】:

  • 你能提供一些测试输入吗?
  • @rockstar 这些是一些测试输入。 1.阅读 $x 本书。 2.读取$$x无效。 3.今天读$x 本书。 4.在 $xminutes 内阅读书籍。 5.你选择了'$x'作为$x。
  • 那么,当 $$x 存在时,您想忽略它还是只提取 $x 部分?
  • @rockstar 应该在 $$x 时输入 $x
  • 试试(?:^|[^'$])\$x(?!')。在此处查看现场演示regex101.com/r/yiezNC/1

标签: javascript regex regex-lookarounds


【解决方案1】:

您还可以简化@revo 的正则表达式,删除前瞻:

(^|[^'$])\$x([^']?)

替换为:

$1\$y$2

See demo:

【讨论】:

  • 这行得通。但是最后的lookahed替换起来更安全。您给出的第一个答案需要两个反向引用,这也可以通过前瞻来避免。感谢您的回复。
  • 我想知道为什么往前看更安全
  • 此外,在没有前瞻支持的情况下更容易移植到其他环境
  • 我相信前瞻是强制性的,否则book$x' 将是一个可能无法预料的匹配。
  • 在这种情况下,你证明我的第一个正则表达式更好,我继续你的例子:6.Take book$x'$x'. 7.拿本书 $x'$x'。 查看演示失败:[link]
【解决方案2】:

下面的 RegEx 应该可以解决问题:

(?<!')(?<!\$)\$x(?!')

它首先检查开头没有',而不是$x前面的$,最后不是以'结尾。

为 JavaScript 编辑

^\$x(?!')

这将在开头选择$x(没有'),而不是'

【讨论】:

  • 但是大部分浏览器仍然不支持lookbehinds。只需要使用前瞻。
  • 你应该提到,你使用 javavascript Regex !
  • 它与 $$x 不匹配。这不是你想要的吗?
  • ^ 字符检查字符串开头是否匹配。因此,它不适用于我提供的任何测试用例。
猜你喜欢
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
相关资源
最近更新 更多