2016-05-22 7 views
1

私は2つのマッチを得ることができるように、 'NNTSY`で正規表現検索をしようとしています。Regex - 文字列内で複数回マッチする

  • NNTS私はパターン?<NGrlyosylation>N[^P][ST][^P])"を使用して一致することを試み
  • NTSY

、私は唯一NNTSで1試合を取得しています。

NNTSYと一致するようにRegexを使用すると、2つの一致が見つかります。

:背景情報:ロザリンド問題はhereです。

ここに私のコードです。

 input = "NNTSY"; 
     Regex regex = new Regex("(?<NGrlyosylation>N[^P][ST][^P])", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
     MatchCollection matches = regex.Matches(input); 
     foreach (Match match in matches) 
     { 
      // Need to add 1 to because match index is 0 based 
      const int offset = 1; 
      yield return match.Index + offset; 
     } 
+1

重複する一致を見つけようとしています – rock321987

+0

@ rock321987はい。まったく。 – Sung

+0

完全な情報源をお求めの方は、こちらの情報源をチェックしてください。>> https://github.com/dance2die/Demo.Rosalind/blob/master/Demo.Rosalind/Demo.Rosalind.Tests/MPRT/MprtTest.cs – Sung

答えて

2

ほとんどのプログラミング言語では、ほとんどのプログラミング言語で重複の検索が許可されていません(少数を除く)。 だから、私はこれを解決するために、純粋な正規表現の方法が存在するとは思わないが、あなたはlookahead

(?=N[^P][ST][^P]). 

としてC#のコードをC#でSubstringを使用することができます

string input = "NNTSY"; 
Regex regex = new Regex("(?=N[^P][ST][^P]).", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

Match match = regex.Match(input); 

while (match.Success) 
{ 
    Console.WriteLine(input.Substring(match.Index, 4)); 
    match = match.NextMatch(); 
} 

Ideone Demo

+0

ありがとう@ rock321987。私はRegexの「先読み」の概念を知らなかったので、私は失われました。少なくとも私が作成したテストはすべてのケースに合格し、私は前進する準備ができています。 – Sung

+0

@Sung glad、それは助けました。「見解」はゼロ幅アサーションです。つまり、文字を消費しないことを意味します。正規表現は、一致する文字列が消費されずに文字列に対してチェックされます。 – rock321987

+0

@Sung '.'正規表現では必須ではありませんでした。単純な先読みではここで十分でしょう。..adding '.'はプロセスを少しスピードアップします – rock321987

関連する問題