2010-06-17 79 views
16

允許的字符是(至少)A-Z,a-z,0-9,ö,Ö,ä,ä,Å,Å和德語,拉脫維亞語,愛沙尼亞語(如果有)特殊字符?有沒有現成的方法,或者我是否需要製作黑名單(非允許的字符)和正則表達式IsMatch?如果沒有現成的如何使用黑名單?如何查找字符串是否包含C#/。NET 2.0中的非字母數字字符?

+0

另一個線程有問題的答案http://stackoverflow.com/questions/2371780/可能會提供更多的見解。 – 2010-06-17 12:57:41

+0

[.net正則表達式匹配來自任何語言的任何種類的字母]的可能重複(http://stackoverflow.com/questions/2949861/net-regular-expression-to-match-any-kind-of-letter-從任何語言) – GvS 2010-06-17 12:59:13

回答

30

我不知道如何對所有這些語言中的特殊字符進行分類,但是您可以檢查Char.IsLetterOrDigit方法是否與您想要的匹配。它的工作原理至少在我所測試的數字和字母:

string test = "Aasdf345ÅÄÖåäöéÉóÓüÜïÏôÔ"; 
if (test.All(Char.IsLetterOrDigit)) { ... } 

Char.IsLetterOrDigit返回true,對於Unicode中歸類爲UppercaseLetter,LowercaseLetter,TitlecaseLetter,ModifierLetter,OtherLetter,或DecimalDigitNumber字符。

+0

什麼是test.All?這不是一個字符串方法,它是一種擴展方法嗎?或者一個LINQ方法? – Task 2011-08-29 14:07:16

+0

@Task'All'是字符串的linq擴展。請參閱http://msdn.microsoft.com/en-us/library/system.string.aspx – mydogisbox 2011-10-06 16:25:01

+0

啊!文檔中的「擴展方法」部分對我來說是新的,我以前從未見過。我想我已經習慣於在早期的「屬性」或「方法」區域中找到所需的所有東西。謝謝! – Task 2011-10-07 13:31:09

5

調查char.IsLetterOrDigit(char)

例如:

myString.All(c => char.IsLetterOrDigit(c)); 
+1

只是好奇,但爲什麼這downvoted?據我所知,這是完成OP所要求的完全有效的方式。 – Flynn1179 2010-06-26 21:00:39

+0

啊..只是仔細一看;從未注意到那裏的0-9要求。我修改了我的答案,使用「IsLetterOrDigit」而不是「IsLetter」。 – Flynn1179 2010-06-26 21:09:10

+0

對此的簡寫爲'myString.All(char.IsLetterOrDigit);' – gls123 2012-06-01 12:24:28

4

一種字符黑名單可能是相當大的:-)

您可以使用正則表達式

^[\d\p{L}]+$ 

匹配十進制數字和字母,不管的腳本。

這個正則表達式由包含速記\d字符類的 - 它包含(在BMP 230總共)每個數字和\p{L}包含分類爲「字母」(46817在BMP)每Unicode字符。所述字符類別然後被重複至少一次並被嵌入在^$之間 - 字符串開始和結束錨點,因此它匹配完整字符串。

對於一些正則表達式引擎,因爲你只是在拉丁字母興趣,很明顯,你也可以使用

^[\d\p{Letter}]+$ 

然而,.NET不支持此功能。上面提到的第一個正則表達式實際上捕獲了任何腳本中的數字或字母的所有內容。所以它會忠實地匹配印度或阿拉伯數字和希伯來語,西里爾文和其他非拉丁文字。取決於你想要什麼,這可能不合適。

如果這樣會造成問題,那麼我看不出更好的選擇,而不是明確列出您想要允許的字符。不過,我認爲假定某種語言的文本總是限制於該語言的腳本是很危險的。如果我要用德文寫一個捷克或波蘭名字,那麼我可能需要的不僅僅是[a-zA-ZäöüÄÖÜß]

+0

+1 \ p {option} – 2010-06-17 12:51:31

+0

謝謝!你能否解釋一下^ [\ d \ p {L}] + $是如何工作的。我從網上查了一下,但是我不能總結它... – 2010-06-17 13:22:23

-1

匹配允許的字符會獲得虛假的回報會更簡單。

相關問題