2017-06-06 57 views
1

我現在有來檢查,如果美國國務院拼寫正確
var r = new Regex(string.Format(@"\b(?:{0})\b", pattern), RegexOptions.IgnoreCase)如何在C#構造正則表達式

模式是包含所有美國各州的管道分隔字符串正則表達式。

這是工作今天打算,直到狀態之一被拼寫,如「佛羅里達。」我也喜歡它挑出來有一個句點字符的事實。

我發現這是正則表達式將只匹配字母。 ^[a-zA-Z]+

如何合併這跟我現在的正則表達式或者是沒可能?

我想這方面的一些變化,但它沒有工作

var r = new Regex(string.Format(@"\b^[a-zA-Z]+(?:{0})\b", pattern), RegexOptions.IgnoreCase); 

編輯:Florida..是在我的輸入字符串。我的模式字符串根本沒有改變。道歉不清楚。

+3

3場比賽爲什麼要使用正則表達式在所有如果你有一個列表中的名稱? – stuartd

+0

如果在文本中出現了佛羅里達......,你的'\ b(?:Florida | Washigton | ...)\ b'仍然會匹配它。 –

+0

這是'Florida..'字符串開始出現在'pattern'或在與'r'正則表達式檢查輸入字符串? –

回答

1

看來你需要開始字符串(^)和字符串($)結束的錨:

var r = new Regex(string.Format(@"^(?:{0})$", pattern), RegexOptions.IgnoreCase); 

正則表達式上面將匹配任何字符串,僅包括一個國家的名字。

+0

這不能解決'Florida..'模式值 – bradbury9

+0

@ bradbury9內道歉:爲什麼你認爲'Florida..'開始出現在'pattern',而不是輸入字符串? –

+0

因爲這個問題是這麼說的'狀態的一個被拼寫,如「佛羅里達。」' – bradbury9

0

你應該做一個更換pattern變量逃脫正則表達式的特殊字符。其中之一是.字符。與pattern.Replace(".", @"\.")類似的東西,但要做所有特殊字符。

+0

順便說一句,你也可以sanitice你的'模式'變量,並使用佛羅里達州,而不是佛羅里達州。 – bradbury9

0

我相信你不能同時圖案合併爲一個,這樣你就必須執行兩個diferent正則表達式運算,一到美國分裂成一個列表,以及隨後的一個在它的每個項目的驗證。

我寧願去的東西「更簡單」,如

var states = input.Split('|').Select(s => new string(s.Where(char.IsLetter).ToArray())) 
       .Where(s => !string.IsNullOrWhiteSpace(s)); 
0

基本上沒有在這裏使用正則表達式。

List<string> values = new List<string>() {"florida", etc.}; 
string input; 
//is input in values, ignore case and look for any value that includes the input value 
bool correct = values.Any(a => 
        input.IndexOf(a, StringComparison.CurrentCultureIgnoreCase) >= 0); 

這比基於正則表達式的選項效率要高得多。這應該與floridaFloridaFlorida...

0

不要直接搜索字符,告訴正則表達式來消耗所有這一切都不針對特定的字符作爲[^\|.]+這樣。它採用了一套[ ]與不^指示說什麼消費是不是文字|.。因此它只消耗所需的文本。如

Colorado|Florida..|New Mexico

回報ColoradoFloridaNew Mexico