2016-11-23 51 views
-1

我想驗證用戶使用正則表達式發送的名字。我發現了多個名字的表達式,但我也想添加德文字符,如äöüß和法語字符à À è È é É ù Ù ì Ì ò Ò ñ Ñ。我嘗試了SO here建議的正則表達式評估器,但這並沒有幫助。無論如何,我會做一個額外的方括號,它會告訴我Your regular expression does not match the subject string.。我究竟做錯了什麼?Java,正則表達式:爲名字添加變音符號和其他德語字符

當前正則表達式:

^([A-Z][a-z]*((\s)))+[A-Z][a-z][äöüß]*$ 

謝謝。

+1

不要限制名字那麼難。我寧願提出一個非常通用的方法:'(?U)[\ p {L} \ p {M} \ s' - ] +',用'String#matches()'來使用它。稍微複雜一點:'(?U)[\ p {L} \ p {M}' - ] +(?:\ s [\ p {L} \ p {M}' - ] +)?' '(?U)[\ p {L} \ p {M}] +(?:[\ s' - ] [\ p {L} \ p {M}] +)*'等等 –

+0

@WiktorStribiżew:你能解釋一下你發佈的正則表達式嗎?謝謝。 –

+0

'\ p {L}' - 任何Unicode字母。 '\ p {M}' - 任何變音符號。 '\ s' - 空格,''''和'-'都是單引號和'-'。 –

回答

3

It is not a good idea to restrict people's names too much,我提出一個比較通用的正則表達式:

s.matches("(?U)[\\p{L}\\p{M}\\s'-]+") 

此正則表達式匹配字符串僅由1個或多個Unicode字母,變音符號,空格,撇號或連字符。

如果您需要更嚴格的檢查,就像一個空白只能出現在字符串中且僅當連續不,使用分組:

"(?U)[\\p{L}\\p{M}'-]+(?:\\s[\\p{L}\\p{M}'-]+)*" 
+0

嗨,你能告訴我如何給這個號碼添加數字嗎?另外,我從來沒有見過這樣的正則表達式,這是不同的類型嗎?謝謝。 –

+0

數字Unicode類別類是'\ p {N}'(或者更嚴格的'\ p {Nd}')。所以,只需在'\ p {M}'之後加上這個,就可以完成了。另一個想法:'「(?U)[ - \\ w \\ p {M} \\''&& [^ _]] +」'(如果您也想刪除&& [^ _]'允許'_')。 –

+0

謝謝,我根據Intellij的建議添加了Nd,並將其更改爲N.在http://www.regular-expressions.info/unicode.html上找到了一個令人敬畏的內容。謝謝。 –

0

我從以前的Wiktor認同的答案。

但是,爲了回答爲什麼你的正則表達式沒有工作:

您預計一個大寫字母后跟0或多個字母和一個空格,然後一個字。而另一個字是1個帽子。字母,1個字母,然後是0或更多變音符號。我不知道任何適合的名字。所有這些特殊字符應與字母相同[]。

也不允許使用連字符名稱。

所以,你的正則表達式可能看起來更像是這樣的:

^([A-ZÜÄÖ][a-züäöß]*(\s|-))*[A-ZÜÄÖ][a-züäöß]*$ 
相關問題