我有以下使用正则表达式的类,根据表达式正确有效的文本,但是当符合条件时,不让我转到下一个组件,这是我的错误?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class VerificarCorreoDAO extends InputVerifier {
Pattern formato = Pattern.compile("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$ ");
Matcher mat;
String texto;
JLabel lblMensaje;
@Override
public boolean verify(JComponent input) {
if (input instanceof JTextField) {
texto = ((JTextField) input).getText().trim();
if (texto.length() == 0) {
return false;
} else if (texto.length() > 0 && texto.length() < 16 || texto.length() > 50) {
return false;
}
}
mat = formato.matcher(texto);
return mat.matches();
}
}
答案 0 :(得分:0)
如果输入Component
不是JTextField
,则formato.matcher
会抛出NPE
,阻止verify
方法返回true
。将语句移到if
块
if (input instanceof JTextField) {
....
return formato.matcher(texto).matches();
} else {
...// handle other component types
}
答案 1 :(得分:0)
变量mat
和texto
是实例字段,但您将它们用作方法变量。将它们移到verify()
:
public class VerificarCorreoDAO extends InputVerifier {
Pattern formato = Pattern.compile("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$ ");
JLabel lblMensaje;
@Override
public boolean verify(JComponent input) {
Matcher mat;
String texto;
if (input instanceof JTextField) {
texto = ((JTextField) input).getText().trim();
if (texto.length() == 0) {
return false;
} else if (texto.length() > 0 && texto.length() < 16 || texto.length() > 50) {
return false;
}
}
mat = formato.matcher(texto);
return mat.matches();
}
}
此外,即使尚未设置,您的代码也会尝试使用texto
。这可能是个问题。
但这里最可能的问题是正则表达式本身;您有一个输入结束标记$
,后跟一个空格。没有可能的输入符合该模式。