2017-08-11 10 views
2

文字列を解析する必要があります。フォーマットは!info1!info2!info2はオプションです。regExの同じグループに2つのパターンをキャプチャするにはどうすればいいですか

私は正規表現を使用して、必要に応じてinfo1info2をキャプチャしようとしています。

私は、次のパターンを思い付いた:

!([^!]*?)!(.*?)!|!(.*?)! 

それは動作しますが、私は結果に満足していない:両方の表現で

!foo!bar! -> Group1: foo Group2:bar 
!foo!  -> Group3: foo 
(https://regex101.com/r/D9d6YP/1) 

fooは同じことを意味し、そしてありますその後も同じように処理されます。 2番目のグループがあるかどうかにかかわらず、私は同じグループでそれをキャプチャしたいと思います。

私は名前のキャプチャグループを使用しようとしましたが、彼らは

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)! 

は、サブパターン名は一意である必要がありますエラーメッセージ」で失敗し、再利用することができないように思えます。

同じグループに異なるパターンをキャプチャする方法はありますか?

+0

Pleaeは、省略可能な部分のない文字列の例を提供します。 – HBP

+0

あなたのregex101リンクはPCREパターンを使用していると思われますか?あれは正しいですか? –

+0

いいえ、.NETです。regex101のフレーバーはデフォルトのものです。 – Maxime

答えて

1

あなたは、単一の分岐に両方の選択肢をマージする非キャプチャオプションのグループを使用することがあります。

  • !から!

    !([^!]*)!(?:([^!]*)!)? 
         ^^^  ^^ 
    

    regex demo

    詳細を参照してください。

  • ([^!]*) - グループ1:以外の任意の0+文字!
  • !から!
  • (?:([^!]*)!)? - 任意の非捕捉基は、1または0に一致する(その結果がメモリに格納されていない、何のIDは、それに割り当てられていません)
    • ([^!]*)の発生 - グループ2:!
    • !以外の任意の0+文字 - !
+1

すごく便利です。 ありがとう – Maxime

関連する問題