2013-04-03 110 views
1

我明白,使用正則表達式時,我可以輸入值|來搜索許多值。例如:如何縮短?

Regex sabrina = new Regex("Rihanna|rihanna|Sabrina|sabrina"); 

我有我想比較其他值的字符串,所以我用if這樣的:

if (rihanna == "Rihanna" || rihanna == "sabrina") 

我的問題是,如果有可能使if短?我知道這個代碼不工作,但我正在尋找這樣的事情:

if (rihanna == "Rihanna|sabrina") 
+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-04-03 21:13:22

+3

爲什麼這裏的事情更短? – JaredPar 2013-04-03 21:14:35

+3

'正規表演sabrina ='我知道了!正則表達式是女性!這一定是爲什麼這麼多人不理解他們。 – dialer 2013-04-03 21:17:32

回答

1

如果您正在尋找easie r維護一個潛在的長字符串候選列表,爲什麼不使用switch語句?從技術上講,它將會是「更長」的字符方式,但是如果你不得不在路上修改東西,或者提供一些細微的二次處理,它可以使事情變得更容易。

2

你可以用Enumerable.Contains方法一起使用List<string>

例子:

var values = new List<string> { "Rihanna", "rihanna", "Sabrina", "sabrina" }; 

if (values.Contains(rihanna)) 
{ 
    // etc. 
} 

if語句是現在很多更簡潔,您可以快速,輕鬆地在您的列表中添加更多的項目。如果您經常執行此操作,則應該將列表聲明移動到包含類中的成員變量,這樣每次調用此方法時都不會產生列表初始化的開銷。

一個更好的解決辦法是使用Enumerable.Any和進行區分大小寫的比較:

if (values.Any(x => String.Equals(rihanna, x, StringComparison.OrdinalIgnoreCase)) 
{ 
    // your code here 
} 

雖然if語句現在時間越長,解決的辦法是更強大。

+0

最後,他將不得不創建'List ',因此它實際上會更長 – 2013-04-03 21:14:00

+0

@caerolus - 代碼可能會更長,但** if if會更短。 – Yakimych 2013-04-03 21:15:53

+0

這個問題已經回答了,但是我並沒有看到試圖使代碼在其他地方更多的代碼變得更短的好處。你爲什麼需要縮短它? – 2013-04-03 21:19:31

5

單線溶液:

if("Rihanna|rihanna|Sabrina|sabrina".Split(new[] {'|'}).Contains(rihanna)) 

或不String.Split方法的使用:

if ((new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }).Contains(rihanna)) 

如果不止一次你應該保存string[]陣列可能值到一個變量進行這種檢查:

var names = new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }; 

if(names.Contains(rihanna)) 
+0

我認爲最後的選擇看起來是長期的最佳選擇。如果需要更多選項,易於維護,如果您正在尋找一些額外的動態處理,您甚至可以傳遞現有的集合。 – 2013-04-03 21:19:33

0

您可以使用自己的正則表達式,並把它作爲一個單行..

if (Regex.Match(rihanna, "Rihanna|rihanna|Sabrina|sabrina").Success) 

或使其區分insensative這樣的..

if (Regex.Match(rihanna, "rihanna|sabrina", RegexOptions.IgnoreCase).Success){ 
+0

要忽略第一個字母的情況,也可以使用'[Rr] ihanna | [Ss] abrina' – david 2013-04-03 21:27:27

0

忽略外殼,它看起來像你要的東西,並使用String.Compare

if(String.Compare(rihanna, "sabrina", StringComparison.OrdinalIgnoreCase) == 0 || 
    String.Compare(rihanna, "rihana", StringComparison.OrdinalIgnoreCase) == 0) { 
    // do stuff 
} 
1

作爲替代上述答案,或許你可以考慮使用一個擴展方法:

public static bool EqualsAny(this string input, params string[] values) 
{ 
    return values.Any(v => String.Equals(input, v, StringComparison.OrdinalIgnoreCase)); 
} 

隨着使用,如:

if (rihanna.EqualsAny("Rihanna", "Sabrina")) 

這應該給你比較可讀/緊湊/短的if比較,尤其是與其他一些替代方案相比。

調整EqualsAny檢查您是否想要OrdinalIgnoreCase,或者隨意添加您希望的超載。甚至可以在「Rihanna | Sabrina」中傳遞的整個管道/分流。

編輯:也許更關鍵的是,它集中了你如何比較,而不是複製到任何地方的代碼。

0

DictionaryHashSet(可能不區分大小寫的名稱檢查)是另一種方法,如果您有多個項目並經常重複檢查,它將爲您提供更好的性能。

var listToCheck = new Dictionary<string, string>( 
    StringComparer.CurrentCultureIgnoreCase) { { "rihanna", null}}; 

if (listToCheck.ContainsKey("Rihanna")) ....