2010-08-30 100 views
1

我想基於像手機*意味着我想要的文字「電話亭」,「手機立方」等C#正則表達式的問題

但是,當我給展位*它選擇電話正則表達式來過濾掉一些文本展位也。它不應該選擇它的禮儀?這裏是代碼,

string[] names = { "phone booth", "hall way", "parking lot", "front door", "hotel lobby" }; 

     string input = "booth.*, door.*"; 
     string[] patterns = input.Split(new char[] { ',' }); 
     List<string> filtered = new List<string>(); 

     foreach (string pattern in patterns) 
     { 
      Regex ex = null; 
      try 
      { 
       ex = new Regex(pattern.Trim()); 
      } 
      catch { } 
      if (ex == null) continue; 

      foreach (string name in names) 
      { 
       if (ex.IsMatch(name) && !filtered.Contains(name)) filtered.Add(name); 
      } 
     } 

     foreach (string filteredName in filtered) 
     { 
      MessageBox.Show(filteredName); 
     } 

它顯示「電話亭」和「前門」。但根據我的標準,它不應該顯示任何內容,bcoz沒有任何字符串以展位或門開始。

在我的正則表達式中有任何問題嗎?

+0

非常感謝您的幫助。 – jaks 2010-08-30 14:52:40

回答

3

的問題是,你是不是指定的字符串必須boothdoor,只要該字符串必須包含boothdoor其次是零長度或更大的字符串開始

但是,如果您將您的正則表達式更改爲^booth.*^door.*,則所有內容應該工作。

插入符號(^)應該指出,意思是「行/字符串的開頭」(根據您的正則表達式是否是在多行模式 - 即,如果.將匹配換行符)

+0

迂腐的筆記:'^'在談論ascii角色時通常被稱爲插入符號。當談到變音標記時(即,當你將信封粘貼在字母上)時,使用Circumflex。請注意,^也是不同的符號。 – Brian 2010-08-30 14:54:58

+0

@布萊恩 - 迂腐筆記注意和應用:-D – 2010-08-30 15:07:43

5

如果你想匹配在一個字符串的開頭與^

所以啓動,例如,如果你想與之匹配的手機開始,再經過包含的字符,你可以做以下

^phone.* 

^將匹配錨定到字符串的開頭。

1

如果你不想讓「電話亭」匹配,你需要在你的正則表達式中指定字符串的開始。

例子:

^booth.* 

將匹配 「攤位」,而不是 「電話亭」。

將匹配任何有「booth」的字符串。

+1

第二個例子中的錯字? – 2010-08-30 14:36:33

+0

Doh!感謝您的高舉。 – 2010-08-30 14:43:00

0

您的正則表達式並未指定模式中匹配字符串的位置是位置受限的。如果你想確保你只匹配初始的子字符串,你必須指定'^'作爲模式的第一部分。

有關更多詳細信息,請參見http://msdn.microsoft.com/en-us/library/az24scfc.aspx