2012-05-11 77 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

另外一個試圖是有效的:

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++; 
} 
相關問題