囲まれているものをキャプチャせずに正規表現でORを使用できますか?


115

私はrubular.comを使用して正規表現を作成していますが、そのドキュメントには次のものが記載されています。

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

中にあるものをキャプチャせずにOR式を使用するにはどうすればよいですか?たとえば、「ac」または「bc」をキャプチャしたいとします。正規表現を使用できません

(a|b)(c)

正しい?それ以来、「a」または「b」のいずれかを1つのグループにキャプチャし、「c」を別のグループにキャプチャします。同じではありません。キャプチャした結果をフィルタリングできることはわかっていますが、それはより多くの作業のようです...

私は何か明白なものを見逃していますか?これが適切であれば、私はこれをJavaで使用しています。


ルーブラルへのリンクに素敵な1つ+1
ブコウスキー

回答:


181

正規表現の実装によっては、構文でいわゆる非キャプチャグループを使用できます(?:…)

((?:a|b)c)

これ(?:a|b)はグループですが、その一致を参照することはできません。したがって、その一致を参照できるの((?:a|b)c)はまたはのどちらacbcです。


やった!超高速応答をありがとう。制限時間(存在していなかったことがわかりました)が経過した後、受け入れます。
goggin13

4
私はアイデアをキャプチャすることはないと思ったaか、bまったく。言い換えれば、することが一致する acbcが、唯一のキャプチャc(?:a|b)(c)
アラン・ムーア

1
@AlanMoore orステートメントで一方をキャプチャし、他方をキャプチャすることは可能ですか?したがって、パターンacor を探していますが、「c」のみabが出力されるab場合に出力したいのですabが、「ac」です。
Moondra 2017

24

実装にそれがある場合は、キャプチャしない括弧を使用できます。

(?:a|b)

@mmutz迅速な対応ありがとうございます!私は両方の答えを受け入れることができればいいのに、それがまさに私が探していたものでした
goggin13

3

ルーブラーでも括弧を使用することはできず、の優先順位|は低くなります。たとえば、a | bcはcccと一致しません


「!〜」演算子は何をしますか?私はあなたの表現が好きで、括弧が少ないので、正規表現はもう乱雑です
goggin13

!〜は、「一致しない」のperlismです。これは、私の部分のずさんな記述でした。修正、ありがとう。
msw 2010

2
わかりません。の優先順位が低いため、括弧を使用する|必要あります。 (?:a|b)c一致acまたはbc(目的の動作)、a|bc一致aまたはまたはbc
アランムーア

2

ORの代替がすべて1文字の場合-「文字セット」演算子を使用するだけです。

([ab]c)

それは一致するacbc、より読みやすくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.