正規表現のオプションのキャプチャグループ?



Regex Optional Capturing Group



解決:

オプションを取得しない理由しぶしぶ資格を得た後の猫。+?それはオプションであり、アンカーされていないということです。エンジンは合法的に処理できるため、その一致を強制されることはありません。の「しっぽ」としての猫。+?順序。

文字列の最後に猫を固定する場合、つまり使用する場合^(dog)。+?(cat)?$、ただし、一致するものは次のとおりです。



パターンp = Pattern.compile( '^(dog)。+?(cat)?$'); for(String s:new String [] {'dog、cat'、 'dog、dog、cat'、 'dog、dog、dog'}){マッチャーm = p.matcher(s); if(m.find()){System.out.println(m.group(1)+ '' + m.group(2)); }}

これは印刷します(デモ1)

犬猫犬猫犬null 

猫の後に何かあった場合の対処法を知っていますか?



あなたはそれを除いて何にでも一致するよりトリッキーな式を構築することによってそれに対処することができます猫、このように:

^(犬)(?:[^ c] | c [^ a] | ca [^ t])+(猫)?

今、猫は、アンカーなしで文字列のどこにでも発生する可能性があります(デモ2)。


@dasblinkenlightの答えは素晴らしいですが、彼/彼女が尋ねられたときに、それの2番目の部分を改善する正規表現があります



猫の後に何かあった場合の対処法を知っていますか?

正規表現^(犬)(。+(猫))?グループ番号をキャプチャする必要があります。オプションの猫を取得するには2ではなく3ですが、char-by-charのトリックがなくても同様に機能します。

そして、これがデモです(これも、@ dasblinkenlightのデモから分岐したもので、この解決策をいじくり回して見つけることができました。ありがとうございます!)


特定の順序がない場合、そのようなパターンに一致する他のオプションは次のとおりです。

方法1

非キャプチャグループの場合:

^(?: dog(?:、| $))+(?: cat)?$

RegExデモ1

またはキャプチャグループの場合:

^(dog(?:、| $))+(cat)?$

RegExデモ2


方法2

見回しで、

(?<=^|, )dog|cat(?=$|,)  

RegExデモ3

単語の境界で、

(?<=^|, )(?:dog|cat)(?=$|,)  

RegExデモ4


方法3

1つしかなかったら猫といいえ文字列の犬、そして

^(?: dog(?:、| $))*(?: cat)?$

オプションだったでしょう。

RegExデモ5

テスト

インポートjava.util.regex.Matcher; import java.util.regex.Pattern; public class RegularExpression {public static void main(String [] args){final String regex = '^(?: dog(?:、| $))*(?: cat)?$';最終的な文字列string = 'cat  n' + 'dog、cat  n' + 'dog、dog、cat  n' + 'dog、dog、dog  n' + 'dog、dog、dog、cat  n' + '犬、犬、犬、犬、猫 n' + '犬、犬、犬、犬、犬 n' + '犬、犬、犬、犬、犬、猫 n' + '犬、犬、犬、犬、犬、犬、犬、猫 n '+'犬、犬、犬、犬、犬、犬、犬、犬、犬 n ';最終的なパターンパターン= Pattern.compile(regex、Pattern.MULTILINE);最終的なマッチャーマッチャー= pattern.matcher(string); while(matcher.find()){System.out.println( '完全一致:' + matcher.group(0)); for(int i = 1; i<= matcher.groupCount(); i++) { System.out.println('Group ' + i + ': ' + matcher.group(i)); } } } }  

出力

フルマッチ:猫フルマッチ:犬、猫フルマッチ:犬、犬、猫フルマッチ:犬、犬、犬フルマッチ:犬、犬、犬、猫フルマッチ:犬、犬、犬、犬、猫フルマッチ:犬、犬、犬、犬、犬完全一致:犬、犬、犬、犬、犬、猫完全一致:犬、犬、犬、犬、犬、犬、犬、猫完全一致:犬、犬、犬、犬、犬、犬、犬、犬、犬

式を簡略化/変更/探索したい場合は、regex101.comの右上のパネルで説明されています。必要に応じて、このリンクで、いくつかのサンプル入力とどのように一致するかを確認することもできます。


正規表現回路

jex.imは正規表現を視覚化します。

ここに画像の説明を入力してください