我一直在尝试制作一个只允许使用字母数字字符的java正则表达式,它可以有空格,但整个字符串不能为空......
几个例子..
" hello world123" //fine
"hello123world" //fine
"hello123world " //fine
" " //not allowed
到目前为止,我已经得到了 的 ^ [A-ZA-Z0-9] [A-ZA-Z0-9 \ S] * $ 虽然这不允许任何前导空格,因此任何带有x前导空格的字符串都不匹配。
我可以添加到表达式以允许引导空格的任何想法吗?
答案 0 :(得分:7)
仅^\s*[\da-zA-Z][\da-zA-Z\s]*$
怎么样?开始时有0个或更多空格,后跟至少1位数字或字母后跟数字/字母/空格。
注意:我没有使用\ w,因为\ w包含“_”,这不是字母数字。
编辑:刚刚在regexpal上测试了所有案例,并且都按预期工作。这个正则表达式似乎是最简单的。
答案 1 :(得分:2)
只需使用预测断言至少有一个非空白:
(?=.*[^ ])[a-zA-Z0-9 ]+
这可以与String.matches()
一起使用:
if (input.matches("(?=.*[^ ])[a-zA-Z0-9 ]+")) {
// input is OK
}
答案 2 :(得分:1)
您可以使用look-ahead机制^(?=\\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