4

我一直在尝试制作一个只允许字母数字字符的java正则表达式,它可以有空格,但整个字符串不能为空白......

几个例子。。

" hello world123" //fine
"hello123world" //fine
"hello123world " //fine
"    " //not allowed

到目前为止,我已经得到 ^[a-zA-Z0-9][a-zA-Z0-9\s]*$ 虽然这不允许任何前导空格,因此任何带有 x 数字前导空格的字符串都不会被匹配.

有什么想法可以添加到表达式中以允许前导空格吗?

4

3 回答 3

7

怎么样^\s*[\da-zA-Z][\da-zA-Z\s]*$。开头有 0 个或多个空格,后跟至少 1 个数字或字母,后跟数字/字母/空格。

注意:我没有使用 \w,因为 \w 包含“_”,它不是字母数字。

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

于 2013-06-14T00:34:45.210 回答
2

只需使用前瞻来断言至少有一个非空白:

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

这可以按原样使用String.matches()

if (input.matches("(?=.*[^ ])[a-zA-Z0-9 ]+")) {
    // input is OK
}
于 2013-06-14T03:27:05.693 回答
1

您可以使用前瞻机制对其进行测试^(?=\\s*[a-zA-Z0-9])[a-zA-Z0-9\s]*$

^(?=\\s*[a-zA-Z0-9])将使正则表达式检查在字符串的开头是否包含零个空格\\s*,然后是来自 class 的字符[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
于 2013-06-13T23:53:02.730 回答