如果你將通過許多字符串循環,那麼也許正則表達式可能不是最好的主意 - 這是一個偉大的工具,但不是最快的。
下面是一個示例代碼,也將工作:
var str = "The Cat ate a mouse";
var search = "cat";
var index = str.IndexOf(search, StringComparison.CurrentCultureIgnoreCase);
if (index == -1)
throw new Exception("String not found"); //or do something else in this case here
var newStr = str.Substring(0, index) + "{" + str.Substring(index, search.Length) + "}" + str.Substring(index + search.Length);
編輯:
正如評論指出的,上面的代碼有一些問題。
因此,我決定嘗試找到一種方法使其工作,而不使用正則表達式。不要誤解我的意思,我喜歡Regex和下一個人一樣。我主要是出於好奇才做到這一點。 ;)
這是我來到後:
public static class StringExtendsionsMethods
{
public static int IndexOfUsingBoundary(this String s, String word)
{
var firstLetter = word[0].ToString();
StringBuilder sb = new StringBuilder();
bool previousWasLetterOrDigit = false;
int i = 0;
while (i < s.Length - word.Length + 1)
{
bool wordFound = false;
char c = s[i];
if (c.ToString().Equals(firstLetter, StringComparison.CurrentCultureIgnoreCase))
if (!previousWasLetterOrDigit)
if (s.Substring(i, word.Length).Equals(word, StringComparison.CurrentCultureIgnoreCase))
{
wordFound = true;
bool wholeWordFound = true;
if (s.Length > i + word.Length)
{
if (Char.IsLetterOrDigit(s[i + word.Length]))
wholeWordFound = false;
}
if (wholeWordFound)
return i;
sb.Append(word);
i += word.Length;
}
if (!wordFound)
{
previousWasLetterOrDigit = Char.IsLetterOrDigit(c);
sb.Append(c);
i++;
}
}
return -1;
}
}
但我不能居功這個!我在谷歌搜索here, on StackOverflow後發現這個,然後修改它。 ;)
使用此方法代替上述代碼中的標準IndexOf
。
我將如何使用它來只匹配第一次出現? – Trevor
哦,看起來很簡單...替換(...,1) – Trevor
@Trevor這將工作,**但**沒有一個選項,接受int和ignorecase。 –