我在密钥监听器中有以下代码:
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网站上检查了这个,似乎认为它应该有效,所以有人能够澄清这段代码是否被破坏或者我的代码中是否有错误
答案 0 :(得分:1)
看起来正则表达式会错过您在示例中写入的空格字符。
在任何情况下,你的正则表达式看起来都要复杂得多。你不需要任何小组匹配来获得你想做的事情。
假设您要匹配一个后跟字符的数字(中间有一个可选空格),您可以使用如下所示的正则表达式:
"[0-9]+\s*[a-zA-Z]+"
使用matches
正确的。
一个简短的解释: 这个正则表达式由三个部分组成:
[0-9]+
- 任意数量的数字,但至少有一个\s*"
- 任何数量的空格字符(空格,制表符等),也不允许使用空格。[a-zA-Z]+
- 任何数量的资本和非资本字符,但至少有一个您还可以进行一些小的更改,以强制执行诸如大写字符后跟任意数量的大写或非大写字符的内容。这可以通过将最后一部分更改为:[A-Z][a-zA-Z]*
此外,如果您希望您的姓氏组件包含空格,只需将\s
添加到方括号中即可将其添加到允许的字符组中。
所以最后你最终会得到这样的东西:
"[0-9]+\s*[A-Z][a-zA-Z\s]*"
但这只是一个建议,可以让你知道在这里可以做些什么。