2017-12-24 19 views
1

正規表現はquantifier *で終わります。 しかし、私は文字列に一致するものはほとんどありません。どうすればすべての試合が見つかるようにすることができますか?私の正規表現:Regex:* Quantifierでの一致数はわずかです。

((CMD1|CMD2)+(?::|;)+.*) 

そして、テスト文字列が"cmd1: test. test. test cmd2: test2. test2. test2" ですだから私はマッチを取得する必要があります:

cmd1: test. test. test 
cmd2: test2. test2. test2 

コマンドは「行く」、「テイク」、「見て」のようなランダムな言葉である可能性があります。 1つの文字列に任意のコマンドのn-occurrenceが存在する可能性があります。 例:

Go: some sentences. and more. Take: other more sentences, and even more text here. Look: more and more. and more. 
+0

は、私はあなたが 'Regex.Split(Sを使用するかもしれないと思う刺さの終わりに続いて1回以上\w+をアサート肯定先読み、 @ "(?!^)\ s *(?= CMD \ d + [:;])"、RegexOptions.IgnoreCase) 'を実行します。 '?=(?=(?:CMD1 | CMD2 | CMDn)[:;])あなたの' CMD'がプレースホルダーの場合は、 '。コマンドが常に空白で区切られている場合は、 '(?!^)\ s *'を '\ s +'に置き換えてください。 –

答えて

1

あなたは肯定先読み使用することができます

\w+:.*?(?= \w+:|$)

  • マッチ単語文字1回以上\w+
  • マッチコロン:
  • マッチ任意の文字のゼロ回以上.*
  • 貪欲でないようにする?
  • 単語文字にコロン:または|(?= \w+:|$)

Demo

+0

ありがとうございます。それが私が探していたものです。私の場合は正規表現を修正しました:(Go | Take | Look):。*?(?= \ w +:| $) –

1
string s = "Go: some sentences. and more. Take: other more sentences, and even more text here. Look: more and more. and more."; 
var matches = Regex.Matches(s, @"(?i)(go|take|look):.+?(?=\s+\w+:)"); 

あなたは\s+を削除することができますが、この場合には、あなたは結果文字列にTrimを呼び出す必要があります。

+0

コマンドのn個の一致があり、コマンドが異なる可能性があります。 –

1

一般的なルールの正規表現を書くことは、あなたが、パターンのすべての出現を検索し、自身の試合に各パターンを置きたいとき、あなたはそのパターンのための正規表現を記述することである、ないそのパターンは*を定量化しました。それ以外の場合は、文字列全体を1つの一致にすることになります。

私はあなたのための正規表現を編集した:

CMD(?:1|2)(?::|;).*?(?=$|CMD) 

初めはかなり自明です。最終的には、.と遅延量子*?をマッチさせました。これは、先読みと一致した後の文字列とすぐに一致を停止します。先読みは、別のCMDまたは文字列の最後に一致します。

大文字と小文字を区別しないオプションをオンにすることを忘れないでください。

+0

それは最初のマッチだけを与える。私はそれを行うことができます:文字列が一致するまで文字列から一致を削除します。しかし、それは回避策です。 –

+0

@DmytroSh。 'Regex.Match'の代わりに' Regex.Matches'を使います。前者は 'MatchCollection'を返します。 – Sweeper

関連する問題