.matches(正则表达式)错误

时间:2015-04-08 13:41:50

标签: java regex swing keylistener

我在密钥监听器中有以下代码:

c = char c = e.getKeyChar();

if(c==KeyEvent.VK_BACK_SPACE) {

    boolean vFormandPresChck = txtAddressLine1.getText().
        matches("((?=.*[0-9])(?=.*[a-zA-Z]))");

    if(vFormandPresChck==true) {
        btnAddAthlete.setEnabled(true);
    } else {
        btnAddAthlete.setEnabled(false);
    }
}

据我所知,我的常规应确保文本字段中的字符串至少包含1个字母和一个数字,然后单击退格键。然而,这似乎不起作用。例如,当单击退格键而文本字段中的字符串为4 Alder时,Button应保持启用状态,因为该字符串将为4 Alde,但它不会保持启用状态。我非常感谢对此问题的任何帮助

修改

我在regex101网站上检查了这个,似乎认为它应该有效,所以有人能够澄清这段代码是否被破坏或者我的代码中是否有错误

1 个答案:

答案 0 :(得分:1)

看起来正则表达式会错过您在示例中写入的空格字符。

在任何情况下,你的正则表达式看起来都要复杂得多。你不需要任何小组匹配来获得你想做的事情。

假设您要匹配一个后跟字符的数字(中间有一个可选空格),您可以使用如下所示的正则表达式:

"[0-9]+\s*[a-zA-Z]+"

使用matches正确的。

一个简短的解释: 这个正则表达式由三个部分组成:

  1. [0-9]+ - 任意数量的数字,但至少有一个
  2. \s*" - 任何数量的空格字符(空格,制表符等),也不允许使用空格。
  3. [a-zA-Z]+ - 任何数量的资本和非资本字符,但至少有一个
  4. 您还可以进行一些小的更改,以强制执行诸如大写字符后跟任意数量的大写或非大写字符的内容。这可以通过将最后一部分更改为:[A-Z][a-zA-Z]*

    来完成

    此外,如果您希望您的姓氏组件包含空格,只需将\s添加到方括号中即可将其添加到允许的字符组中。

    所以最后你最终会得到这样的东西:

    "[0-9]+\s*[A-Z][a-zA-Z\s]*"
    

    但这只是一个建议,可以让你知道在这里可以做些什么。