2012-05-11 13 views
4

C#を使用して文字列内のパターンのすべてのインデックスを見つける方法はありますか?例えばC#で文字列内のすべてのパターンインデックスを見つける#

私はそれクリーナー機能させるためのコードを編集この45##78$$#56$$JK01UU

+0

を持っているのだろうか? –

+0

何か試しましたか?あなたは正規表現を試しましたか? – SCB

+1

いくつかの入力文字列と出力を表示できますか? – Habib

答えて

9
string pattern = "##"; 
string sentence = "45##78$$#56$$J##K01UU"; 
IList<int> indeces = new List<int>(); 
foreach (Match match in Regex.Matches(sentence, pattern)) 
{ 
     indeces.Add(match.Index); 
} 

indecesは、あなたが "パターン" を定義するにはどうすればよい2、14

3

ような文字列内のすべての##パターンのインデックスを見つけたいです。

public IEnumerable<int> FindAllIndexes(string str, string pattern) 
{ 
    int prevIndex = -pattern.Length; // so we start at index 0 
    int index; 
    while((index = str.IndexOf(pattern, prevIndex + pattern.Length)) != -1) 
    { 
     prevIndex = index; 
     yield return index; 
    } 
} 

string str = "45##78$$#56$$JK01UU"; 
string pattern = "##"; 

var indexes = FindAllIndexes(str, pattern); 
+1

+1、これは正しいです – Habib

+0

私はこれが正規表現を使用する答えよりも速くなければならないと思います。いくつかのプロファイリング結果を得ることはいいですね。 – mortb

2

このような正規表現の検索を使用すると、文字列内のパターンのすべてのインデックスを取得できます。効率的になろうと

string input = "45##78$$#56$$JK01UU", pattern = Regex.Escape("##"); 
Regex rx = new Regex(pattern); 
var indices = new List<int>(); 
var matches = rx.Matches(s); 
for (int i=0 ; i<matches.Length ; i++) 
{ 
    indices.Add(matches[i].Index); 
} 
+0

おそらく 'Regex.Escape()'をパターン上で実行する必要があります。 – yamen

+0

@yamenよろしくお願いいたします。私の答えを更新しました。 – McGarnagle

0

もう1:

public IEnumerable<int> FindPatternIndexes(string input, string search) 
{ 
    var sb = new StringBuilder(input); 

    for (var i = 0; search.Length <= sb.Length; i++) 
    { 
     if (sb.ToString().StartsWith(search)) yield return i; 
     sb.Remove(0,1); 
    } 
} 
0

をテストしました。働いた。しかし、ややばかな。

string foo = "45##78$$#56$$JK01UU"; 
char[] fooChar = foo.ToCharArray(); 

int i = 0; 
bool register = false; 

foreach (char fc in fooChar) 
{ 
    if (fc == '#' && register == true) 
    { 
     MessageBox.Show("Index: " + (i-1)); 
    } 
    else if (fc == '#') 
    { 
     register = true; 
    } 
    else 
    { 
     register = false; 
    } 
    i++; 
} 
関連する問題