2011-11-16 135 views
1

我有寫一個正則表達式來驗證文本條目的要求。文本必須介於5到16個字符之間(a-Z加上連字符,下劃線和空格)。這很好,但它也必須檢查沒有連續的空格。用於檢查重複空格字符的正則表達式

例如

hello  // PASS 
hello there // PASS 
hi there you // PASS 
hello there // FAIL - two spaces between hello and there 
+3

連續的連字符和連續的下劃線怎麼樣?兩種或兩種以上的遊戲怎麼樣,比如'hello- _there'?在字符串的開頭或末尾,空格,連字符或下劃線怎麼樣? –

+0

@Alan - 字符串中任意位置的連續空格 –

回答

4

您可以使用類似:

/^(?!.* )[-a-z_ ]{5,16}\z/i 
+0

謝謝,但是當我測試它時,這並不驗證任何示例。我也在http://www.regexplanet.com/simple/index.html進行了測試,並且在那裏也失敗了。有任何想法嗎? –

+1

@TheFlowerGuy,嘗試不帶分隔符和標誌:'^(?!。*)[ - a-z_] {5,16} \ z'或'^(?!。*)[ - a-z_] {5 ,16} $' –

+1

你在使用Java嗎?這就是RegexPlanet使用的。請用您使用的語言/口味標記問題。 –

1

在Java中我會去與

" |[^\\p{L}_ -]" 

"不是正則表達式的一部分)。 如果字符串與此正則表達式匹配,則失敗。 我會檢查大小單獨在一個if語句(更快的方式)。

如果你想要做一些語言沒有Unicode屬性:

\s\s|[^A-Za-z_ -] 
+0

如果您像我一樣使用格式化塊格式,則會保留空白。另外,你應該提到這個正則表達式需要用'find()'方法來應用,而不是'matches()'。 –

+0

感謝您的提示。 應該注意的是,這個解決方案比上面的解決方案快得多。 此解決方案將檢查最佳情況下的一個字符(起始處或2個空格處的字符不正確)以及最差情況下的所有字符(正確的字符串)。帶有負向預測(?!。*)的解決方案(上面的那個)總是會檢查所有字符(最好的情況 - 最後兩個空格),它會檢查所有字符兩次(最壞的情況 - 正確的字符串或2個空格開始)。 –

0

正則表達式:

^([\w-_]+([\s]{0,1})[\w-_]+)$ 

匹配這些

hello 
hello there 
hi there 
he-llo 
he_las test 

而且這些

hello there 
hello  there 
+0

未能匹配'你好,你';錯誤地匹配'123 456';允許製表符,換行符和其他空白字符;並沒有驗證長度。此外,不要將空間設置爲可選,您應該將它與以下部分進行分組並使其成爲可選:'^(?=。{5,16} $)[A-Za-z _-] +(?: [A -za-Z _-] +)* $' –