2010-06-24 170 views

回答

68

如果要匹配非字母數字符號,請使用\W|_

Regex pattern = new Regex(@"\W|_"); 

這將匹配除0-9和a-z以外的任何內容。有關\W角色等級和其他可在此處獲得的信息。

+2

不是爲了挑戰大師,而是你不是指'\ W'? '\ w'(小寫字母w)匹配所有單詞字符。 – Alan 2010-06-24 21:38:31

+4

這幾乎是完全錯誤的。 – 2010-06-24 21:42:49

+2

然而,它得到3 upvotes。 – Alan 2010-06-24 21:44:19

2

您可以檢查相反的情況?

Match match = Regex.Match(@"^([a-zA-Z0-9]+)$"); 
if (!match.Success) { 
    // it's alphanumeric 
} else { 
    // it has one of those characters in it. 
} 
10

你也可以避免正則表達式,如果你想:

return s.Any(c => !char.IsLetterOrDigit(c)) 
+1

現在獲得額外的信用:哪個性能更好? – Alan 2010-06-24 21:40:43

+0

嘿嘿..有時你只需要使用正則表達式的一切:)即使我喜歡正則表達式,通常最好避免它們。 – simendsjo 2010-06-24 21:41:02

+0

@Alan - 稍後我會運行一個測試(除非其他人發出響聲),但我相信這會更快一些。 – ChaosPandion 2010-06-24 21:45:58

2

我沒有得到你的整個問題,但這正則表達式匹配包含至少一個非字母數字字符那些字符串。這包括空白(雖然看不到你的列表中)

[^\w]+ 
2

你的正則表達式只需要很少的調整。連字符用於形成A-Z等範圍,因此如果要匹配文字連字符,則必須使用反斜槓將其轉義或將其移至列表的末尾。您還需要轉義方括號,因爲它們是字符類的分隔符。然後在開始時擺脫這個問號,並且你在做生意。

Regex symbolPattern = new Regex(@"[[email protected]#$%^&*()_+=\[{\]};:<>|./?,-]"); 

如果你只想匹配ASCII標點符號,這可能是最簡單的方法。 \W除了標點符號之外還匹配空格和控制字符,並且它與整個Unicode範圍中的它們匹配,而不僅僅是ASCII。

雖然您似乎錯過了幾個字符:反斜槓,撇號和引號。添加這些爲您提供:

@"[[email protected]#$%^&*()_+=\[{\]};:<>|./?,\\'""-]" 

最後,這是一個好主意,始終使用C#的逐字字符串(@"...")的正則表達式;它可以爲反斜槓節省很多麻煩。引號是通過加倍來逃脫的。

相關問題