.matches(正则表达式)错误



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

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时单击退格键时,按钮应保持启用状态,因为字符串将为4 Alde,但不会保持启用状态。我非常感谢对这个问题的任何帮助

编辑

我已经在regex101网站上检查了这一点,似乎认为它应该可以工作,所以有人能够澄清这段代码是否已损坏,或者这是我的代码的其余部分中的错误吗?

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

在任何情况下,你的正则表达式看起来都比实际情况复杂得多。你不需要任何组匹配就可以得到你喜欢做的事情。

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

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

使用正确的matches

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

  1. [0-9]+-任意数量的数字,但至少有一个
  2. s*"-任意数量的空白字符(空格、制表符等),也不允许有空格
  3. [a-zA-Z]+-任意数量的大写和非大写字符,但至少有一个

您还可以做一些小的更改,以强制执行大写字符后面跟着任意数量的大写或非大写字符之类的内容。这可以通过将最后一部分更改为:[A-Z][a-zA-Z]* 来完成

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

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

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

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

最新更新