2011-11-16 133 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 _-] +)* $' –