2013-08-05 45 views
0

對於正則表達式,我是一個完整的新手,並且想知道是否有人可以幫助我。我不確定使用regEx是否是正確的方法,所以如果您有更好的想法,請隨時留言。 (我會循環很多字符串)。regEx以不區分大小寫的字符串

基本上,我想查找/替換一個字符串,用{}包裝匹配並保留字符串的原始大小寫。

例子:

Source: "The CAT sat on the mat."  
Find/Replace: "cat"  
Result: "The {CAT} sat on the mat." 

我想查找/替換工作只在第一次出現了,我還需要知道是否查找/替換確實匹配與否。

我希望我已經解釋清楚了。

謝謝。

回答

5
Regex theRegex = 
    new Regex("(" + Regex.Escape(FindReplace) + ")", RegexOptions.IgnoreCase); 
theRegex.Replace(Source, "{$1}", 1); 

如果你想單詞邊界公差:

Regex theRegex = 
    (@"([\W_])(" + Regex.Escape(FindReplace) + @")([\W_])", RegexOptions.IgnoreCase) 
theRegex.Replace(str, "$1{$2}$3", 1) 
+0

我將如何使用它來只匹配第一次出現? – Trevor

+0

哦,看起來很簡單...替換(...,1) – Trevor

+1

@Trevor這將工作,**但**沒有一個選項,接受int和ignorecase。 –

1

如果你將通過許多字符串循環,那麼也許正則表達式可能不是最好的主意 - 這是一個偉大的工具,但不是最快的。

下面是一個示例代碼,也將工作:

 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

+2

你的速度明顯更快(如果你做了一百萬次,速度提高了8倍)**,但**它遭受了clbutt問題。如果你把Class當成str和ass來作爲搜索,它會用Cl {ass}來代替Class。 –

+0

我只需要在匹配 – Trevor

+0

@ It'sNotALie首次發現/替換。嗯,公平點!我會看看我能不能做得更好。 – Shaamaan

1

試試這個:

class Program 
{ 
    const string FindReplace = "cat"; 
    static void Main(string[] args) 
    { 
     var input = "The CAT sat on the mat as a cat."; 
     var result = Regex 
      .Replace(
      input, 
      "(?<=.*)" + FindReplace + "(?=.*)", 
      m => 
      { 
       return "{" + m.Value.ToUpper() + "}"; 
      }, 
      RegexOptions.IgnoreCase); 
     Console.WriteLine(result); 
    } 
} 
相關問題