2013-04-18 88 views
5

我有一個應用程序需要對某些字段進行一些驗證。其中之一是可以由2個字組成的姓氏。在我的正則表達式中,我必須接受這些空間,所以我嘗試了很多東西,但是我沒有找到任何解決方案。C#正則表達式 - 接受字符串中的空格

這裏是我的正則表達式:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ-\s]+$" 

\s通常的空間,但它不工作,我得到這個錯誤信息:

parsing "^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ-\s]+$" - Cannot include class \s in character range. 

任何想法的傢伙?

+1

其他的話題,但看看[Unicode屬性](http://www.regular-expressions.info/unicode.html#prop)。 '\ p {L}',這是匹配任何語言的一個字母,所以你的表達式看起來像「@」^ [\ p {L} \ s] [\ p {L} \ s - ] + $「'是更好的,你不必考慮每封特殊的信件。 – stema

回答

9

-表示字符範圍,就像你使用A-Z來描述A和Z之間的任何字符。您正則表達式使用ñ-\s該引擎試圖解釋爲n和\ S之間的任何字符 - 然後通知,該\s不作一大堆的道理存在,因爲\s本身只是對任何一個縮寫空白字符。

這就是錯誤來自的地方。

要擺脫這個,你應該總是-結束你的性格類,如果要包括-文字字符:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\s-]+$" 

這樣,發動機知道那\s-不是一個字符範圍,而是兩個字符\s-分開。

另一種方式是爲了躲避-字符:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêç\-\s]+$" 

所以,現在的引擎解釋ñ\-\s不是作爲一個字符範圍,但作爲人物ñ-\s的任何。就我個人而言,雖然我總是儘量避免逃避,因爲恕我直言,它雜亂無章,不必要地延長表達式的長度。

+1

逃逸不易碎。假設你有一個操作的角色類:'[+ - ]'。另一位程序員可能會將其更改爲'[+ - * /]',打破了這種模式。 – Kobi

+0

我同意,但您可以以任何方式爭辯。假設你有一個模式'[+ \ - *]',因爲你不能進行分割。有一天你可以做到這一點,另一位程序員將它改爲'[+/- *]',因爲他認爲你剛剛得到了錯誤的方式。關你逃跑。所以,這實際上不是任何方式的論點。我只是重視可讀性,特別是在正則表達式中,因爲它們足夠複雜。 –

+0

非常感謝您的回答! – Traffy

4

你需要躲避最後-字符 - ñ-\s解析像範圍a-z

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\-\s]+$" 

另見正則表達式風暴:[a-\s][a\-\s]

0

[正則表達式(@ 「^ [A-ZA-Z \ s] + $」 的ErrorMessage = 「只有字母字符和空格是允許的。」)

這工作

相關問題