【问题标题】:Can I use an OR in regex without capturing what's enclosed?我可以在正则表达式中使用 OR 而不捕获包含的内容吗?
【发布时间】:2011-03-23 16:02:30
【问题描述】:

我正在使用rubular.com 构建我的正则表达式,他们的文档描述如下:

(...)   Capture everything enclosed
(a|b)   a or b

如何使用 OR 表达式而不捕获其中的内容?例如,假设我想捕获“ac”或“bc”。我不能使用正则表达式

(a|b)(c)

对吗?从那时起,我在一组中捕获“a”或“b”,在另一组中捕获“c”,不一样。我知道我可以过滤捕获的结果,但这似乎需要更多工作......

我是否遗漏了一些明显的东西?如果合适的话,我在 Java 中使用它。

【问题讨论】:

  • 不错的一个 +1 链接到 rubular

标签: regex capture regex-group


【解决方案1】:

如果您的 OR 选项都是单个字符 - 您可以使用“字符集”运算符:

([ab]c)

它只会匹配 acbc 并且更具可读性。

【讨论】:

    【解决方案2】:

    即使是 rubular 也不会让你使用括号,| 的优先级很低。例如a|bc does not match ccc

    【讨论】:

    • '!~' 运算符是做什么的?我喜欢你的表达,用更少的括号,正则表达式已经够乱了
    • !~ 是“不匹配”的一种说法,我的写作很草率;已修复,谢谢。
    • 我不明白你。 | 的低优先级是您确实必须使用括号的原因。 (?:a|b)c 匹配 acbc(所需的行为),而 a|bc 匹配 abc
    【解决方案3】:

    如果您的实现有它,那么您可以使用非捕获括号:

    (?:a|b)
    

    【讨论】:

    • @mmutz 感谢您的快速响应!我希望我能接受这两个答案,这正是我正在寻找的
    【解决方案4】:

    根据正则表达式的实现,您可以使用所谓的非捕获组,语法为(?:…):

    ((?:a|b)c)
    

    这里(?:a|b) 是一个组,但您不能引用它的匹配项。所以你只能引用((?:a|b)c)的匹配,即acbc

    【讨论】:

    • 做到了!感谢您的超快速响应。我会在时间限制(我不知道存在)到期后接受。
    • 我认为这个想法根本不是捕获ab。换句话说,要匹配 acbc,但只捕获 c(?:a|b)(c)
    • @AlanMoore 是否可以在 or 语句中捕获一个而不是另一个?所以我正在寻找模式acab,但如果ab 并且只有'c' 输出是'ac',我想输出ab
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2012-12-11
    • 1970-01-01
    • 2021-08-11
    • 2022-01-08
    • 2019-07-16
    相关资源
    最近更新 更多