2016-10-14 8 views
0

私は下の文字列を3つのグループに分割しようとしていますが、使用しているパターンで期待どおりに動作していないようです。つまり、matcher.group(3)を呼び出すと、*;+g.3gpp.cs-voice;requireの代わりにnull値が返されます。パターンに何が問題なの?Java正規表現のパターングループのキャプチャ

文字列:"*;+g.oma.sip-im;explicit,*;+g.3gpp.cs-voice;require"

パターン:期待(\\*;.*)?(\\*;.*?\\+g.oma.sip-im.*?)(,\\*;.*)?

グループ1:null、 グループ2:*;+g.oma.sip-im;explicit、 グループ3:,*;+g.3gpp.cs-voice;require

実際:

グループ1:null、 グループ2:*;+g.oma.sip-im、 グループ3:null

+1

グループ1と同様のパターンをキャプチャグループ3(義務) '、'で分割するだけですか? – TheLostMind

+1

@ TheLostMind:不正確/予期しない結果が生じるためです。 –

+0

'[*] [^、*] +'を使ってマッチを得ることができますか? – LukStorms

答えて

0

あなたが実際に非貪欲な方法で自分のパターンに一致しない取得結果。グループ2はできるだけ短い結果に拡張されます

*;+g.oma.sip-im 

最後のグループは、最後に疑問符があるために省略されています。あなたの目的にはあまりにも複雑な正規表現を構築しているように見えます。

0

実際には、文字列内にさらに文字があると予想されるため、(,\*;.*)?は一致しません。

String pat = "(\\*;.*)?(\\*;.*?\\+g\\.oma\\.sip-im)(?:.*?(,\\*;.*))?"; 

regex demoを参照してください:あなたは最後に?を除去することにより、第三のグループ義務を行いますが、任意の非キャプチャグループ内の全.*? +グループ3をラップする必要があります。

リテラルドットは正規表現パターンでエスケープする必要があることに注意してください。

詳細

  • (\\*;.*)? - グループ1(オプション)
    • \\*;捕捉 - *;ストリング
    • .* - 改行記号以外のゼロ以上の文字、などのような多くの可能
  • (\\*;.*?\\+g\\.oma\\.sip-im) - グループ2
    • \\*;捕捉(必須) - *;ストリング
    • .*? - 改行記号以外のゼロ以上の文字、
    • \\+g\\.oma\\.sip-imできるだけ少ないよう - リテラル文字列+g.oma.sip-im
  • (?:.*?(,\\*;.*))? - 非捕捉グループ(オプション)マッチング
    • .*? - 改行記号以外の任意のゼロ個以上の文字、
    • (,\\*;.*)できるだけ少ないように - そうでないのはなぜ