【问题标题】:Regex: Do not include a substring within a group正则表达式:不要在组中包含子字符串
【发布时间】:2011-04-03 19:27:54
【问题描述】:

我想知道是否可以在组内排除部分匹配项。

我相信/(foo((?:bar)|(bad)))/ 会匹配“foobar”或“foobad”以及包含“foobar”或“foobad”的组 1。我希望它匹配“foobar”或“foobad”,但第 1 组仅包含“foo”或“foobad”。我知道(?:...) 正则表达式语法用于创建您以后无法引用的组,但上述用法意味着有3 个组: \1 整个匹配; \2 'bar' 或 'bad'; \NONE 是未使用的组 'bar';和 \3 为“坏”。

你知道我要去哪里吗?我想有选择地从另一个组中排除一个子组。

或者,我想以 OR 方式定义第 1 组两次 /(foobar)|(foobad)/ 尽管我知道输入不会达到我想要的效果。在这种情况下,如果将“foobad”作为输入,尝试访问match[1] 会导致“未定义”错误。我知道这是因为它实际上将其分为第 1 组和/或第 2 组。

我正在用 javascript 正则表达式方言写这个。

【问题讨论】:

    标签: javascript regex regex-group


    【解决方案1】:

    我希望它匹配“foobar”或“foobad”,但第 1 组仅包含“foo”或“foobad”。

    正则表达式:

    /(foo(?:(?=bar)|bad))/
    

    这样做:第 1 组要么包含 foo(仅当 bar 紧随其后),要么包含 foobad

    【讨论】:

    • 好答案。出于某种原因,我认为 JS 不支持前瞻,但它确实支持,所以它可以完美地工作。 (无论如何,一旦括号匹配;)
    • 感谢蒂姆的更正 :)。是的,JS 支持look-aheads,但不支持look-behinds。
    • 应该注意的是,这将改变任何后续匹配的行为。例如,(foo(?:(?=bar)|bad))x 将匹配 foobadx,但将匹配 foobarx
    • @Tim,不确定我是否关注你...字符串 foobarx 确实 匹配(至少是 foo 部分)。跨度>
    • 啊,先行是解决方案。谢谢!
    【解决方案2】:

    (?:bar) - 匹配 bar 但不记得匹配。这些称为非捕获括号。无法从结果数组的元素 [1], ..., [n] 或预定义的 RegExp 对象的属性 $1, ..., $9 中调用匹配的子字符串。

    更多信息:Mozilla Developer Center

    【讨论】:

    • 你没抓住重点,他不想在第 1 组中捕获“bar”。
    • [bar|bad] 只匹配一个字符:bar|d
    • @BartPiers - 是的,我的错,纠正了。 @TimSylvester - 不明白他的问题。试图弄清楚。
    • [(?:bar)|(?:bad)] 再次只匹配一个字符,其中之一:(?:bar)、@987654 @ 或 d。请注意,[] 之间的所有内容都是字符集。见:regular-expressions.info/charclass.html
    • 我完全疯了吗?你又说对了...我应该多关注我的帖子...
    【解决方案3】:

    这和你想要的很接近

    /((?=foobar)foo|foobad)/
    

    这是一个匹配foo(但只有从它开始匹配foobar)或foobad的单个组。 (?=...) 形式是一个零宽度的前瞻断言。

    这不完全是您想要的,因为 foobar 的匹配只是 foo 但 IMO 能够使其匹配 foobar 但仅将 foo 分组在与 foobad 匹配的同一组中,而不是需要lookbehind和 AFAIK 它在 javascript 中不可用。

    【讨论】:

      猜你喜欢
      • 2011-07-22
      • 1970-01-01
      • 2018-03-08
      • 2012-05-11
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多