Java正则表达式-字母数字,允许前导空格但不允许空字符串。

4
我一直在尝试制作一个Java正则表达式,只允许使用字母和数字字符,可以包含空格,但整个字符串不能是空白...
一些例子:
" hello world123" //fine
"hello123world" //fine
"hello123world " //fine
"    " //not allowed

到目前为止,我已经得到了这个正则表达式^[a-zA-Z0-9][a-zA-Z0-9\s]*$,但是它不允许任何前导空格,因此任何具有x个前导空格的字符串都无法匹配。您有什么想法可以添加到表达式中以允许前导空格?

^[\s]*[a-zA-Z0-9][a-zA-Z0-9\s]*$ 这个怎么样?虽然有点复杂,但是它能够保证字符串中间至少有一个字符,并且允许一些空格或者没有空格。 - Craig
3个回答

9

这个正则表达式是“^\s*[\da-zA-Z][\da-zA-Z\s]*$”。在开头有0或多个空格的情况下,至少有一个数字或字母,后面跟着数字、字母或空格。

注意:我没有使用“\w”,因为它包括“_”,而下划线不是字母数字字符。

编辑:我在regexpal上测试了所有你提供的案例,都按预期工作。这个正则表达式似乎是最简单的一个。


不错,但我认为您不想使用.*,因为它将接受任何字符(包括逗号等特殊字符),而[\d\w\s]*则不会。 - Pshemo
@Pshemo 是的,我想你是正确的。主要的一点是,到这个时候,你已经完成了所有的艰苦工作,所以你不在乎接下来会发生什么。 - David says Reinstate Monica
\d[\d\w]中是多余的,因为\w包括\d\w == [\da-zA-Z_] - Bohemian
@ah,你说得对。实际上我应该保留\d但是将\w替换为a-zA-Z,因为我不想要下划线“_”。 - David says Reinstate Monica
也将[\da-zA-Z]+替换为[\da-zA-Z],不需要+,因为它已被下一个*覆盖。 - Ashish Patil

3

只需要使用前瞻来断言至少有一个非空格字符:

(?=.*[^ ])[a-zA-Z0-9 ]+

这可以直接使用String.matches()

if (input.matches("(?=.*[^ ])[a-zA-Z0-9 ]+")) {
    // input is OK
}

1
您可以使用向前查看机制进行测试 ^(?=\\s*[a-zA-Z0-9])[a-zA-Z0-9\s]*$ ^(?=\\s*[a-zA-Z0-9]) 将使正则表达式检查字符串开头是否包含零个或多个空格 \\s*,然后是类别中的字符 [a-zA-Z0-9]
演示:
String[] data = { 
        " hello world123", //fine
        "hello123world", //fine
        "hello123world ", //fine
        "    " //not allowed
         };

for(String s:data){
    System.out.println(s.matches("(?=.*\\S)[a-zA-Z0-9\\s]*"));
}

输出

true
true
true
false

我认为查找过程不必要地增加了复杂性,同时也降低了效率(虽然在这种情况下影响不大)。 - David says Reinstate Monica
@Dgrin91 你说得没错,但我会保留这个答案,以展示解决此类问题的其他方法。也许将来会有人需要使用这种形式 :) - Pshemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接