我可以在正则表达式中使用OR而不捕获其中包含的内容吗?


115

我正在使用rubular.com构建我的正则表达式,其文档描述了以下内容:

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

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

(a|b)(c)

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

我缺少明显的东西吗?如果相关的话,我正在Java中使用它。


不错的+1链接到rubular
bukowski

Answers:


181

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

((?:a|b)c)

(?:a|b)是一个群组,但您无法引用其匹配项。所以,你只能引用本场比赛的((?:a|b)c)要么是acbc


做到了!感谢您的超快速响应。时限(我不知道存在)到期后,我将接受。
goggin13年

4
我认为这个想法是不是捕捉到ab根本。换句话说,要匹配 acbc,但只能捕获以下内容c(?:a|b)(c)
艾伦·摩尔

1
@AlanMoore是否可以在or语句中捕获一个而不捕获另一个?所以我正在寻找模式acab,但是我想输出abif ab并且只有'c'输出为'ac'。
Moondra'8


3

甚至rubular都不会让您使用括号,并且的优先级|很低。例如a | bc与ccc不匹配


'!〜'运算符有什么作用?我喜欢您的表情,用较少的括号,正则表达式已经很凌乱
goggin13

!〜是“不匹配”的perlism,对我而言这是草率的写作;固定,谢谢。
msw

2
我不明白你 的低优先级|就是为什么你必须使用括号。 (?:a|b)c符合acbc(所需的行为),而a|bc符合abc
艾伦·摩尔

2

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

([ab]c)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.