【问题标题】:.matches(regular expression) mistake.matches(正则表达式)错误
【发布时间】:2015-04-08 13:41:50
【问题描述】:

我在关键监听器中有以下代码:

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 网站上检查了这个,似乎认为它应该可以工作,所以有人能够澄清这个代码是否被破坏,或者它是否是我的其余代码中的错误

【问题讨论】:

  • 正则表达式似乎没问题。
  • 你到底想匹配什么?至少一个数字后跟至少一个字符?您的正则表达式似乎缺少写入示例字符串的空间。
  • 那么我该如何添加空间呢?我之前没有写过带空格的
  • 也只是尝试在字符串中没有空格,但它仍然不起作用@Nitram
  • 没有看到实际的字符串很难说。请记住:matches() 尝试匹配整个字符串,而不仅仅是其中的一部分。也许你想要find()

标签: java regex swing keylistener


【解决方案1】:

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

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

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

"[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-Z\s]*"

但这只是一个建议,让您了解可以在这里做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多