2012-02-10 59 views
3

我想選擇所有僅包含字母或只信件和其他具有點結束標記結束。正則表達式 - >僅字母和一個圓點

的有效字舉例:"abc", "abc."
無效"a.b" "a2"

我已經試過這

string[] tokens = text.Split(' '); 
var words = from token in tokens 
      where Regex.IsMatch(token,"^[a-zA-Z]+.?$") 
      select token; 

^[a-zA-Z]+ - 只有字母一次或多次,並用字母

.?$ =結尾開始0或1點?不知道這個

回答

5

在正則表達式中,一個非轉義的.模式匹配任何字符(包括數字)。因此,你的正則表達式將匹配不希望的記號,如"a2"

您需要將您的點號轉義爲\.

string[] tokens = text.Split(' '); 
var words = from token in tokens 
      where Regex.IsMatch(token,@"^[a-zA-Z]+\.?$") 
      select token; 

編輯:此外,還可以通過回顧後和預讀您的合併邏輯Split(' ')到你的正則表達式。這可能會提高效率,但它確實會降低易讀性一點。

var words = Regex.Matches(text, @"(?<=\ |^)[a-zA-Z]+\.?(?=\ |$)") 
       .OfType<Match>() 
       .Select(m => m.Value); 
  • (?<=\ |^)回顧後意味着匹配必須用一個空格之前或啓動的字符串。
  • (?=\ |$) lookahead表示匹配必須由空格或字符串結尾。
1

你需要逃避.

^[a-zA-Z]+\.?$ 

否則,.是一個特殊字符匹配(幾乎)所有的字符 - 不僅僅是時間。

相關問題