【问题标题】:Java Regex - alphanumeric, allowing leading whitespace but not blank stringJava Regex - 字母数字,允许前导空格但不允许空白字符串
【发布时间】:2013-06-13 23:39:21
【问题描述】:

我一直在尝试制作一个 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]*$ 怎么样?这有点过头了,但它会保证中间某处有一个字符,并允许一些空格或没有空格

标签: java regex string


【解决方案1】:

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

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

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

【讨论】:

  • 很好,但我相信你不想使用.*,因为它可以接受任何字符(也包括像逗号这样的特殊字符),但[\d\w\s]*
  • @Pshemo 是的,我想你是对的。重点是,此时你已经完成了所有艰苦的工作,所以你不在乎接下来会发生什么。
  • \d[\d\w] 中是多余的,因为\w 包含 \d: \w == [\da-zA-Z_]
  • @啊,你是对的。所以实际上我应该保留 \d 但用 a-zA-Z 替换 \w 因为我不想要 _。
  • 也将[\da-zA-Z]+ 替换为[\da-zA-Z] 不需要+,因为它被next *覆盖了
【解决方案2】:

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

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

这可以与String.matches() 一起使用:

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

【讨论】:

    【解决方案3】:

    您可以使用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
    

    【讨论】:

    • 我认为查找不必要地使事情复杂化并且降低了效率(尽管在这种情况下并不多)。
    • @Dgrin91 你是对的,但我会留下这个答案,因为它是为了展示解决此类问题的其他方法。也许以后有人将不得不使用此表单:)
    猜你喜欢
    • 2015-10-04
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多