Regex para DocumentFilter para que coincida con todos los números decimales pero también con solo un decimal al final
Qestion First: Necesito regex para que coincida111
o111.
o111.111
(solo números aritrarty) para unDocumentFilter
. Necesito que el usuario pueda ingresar111.
con undecimal
y nada después Parece que no puedo hacerlo bien.
Todas las expresiones regulares que encuentro coinciden solotodas números decimales, es decir
12343.5565
32.434
32
Me gusta esta expresión regular
^[0-9]*(\\.)?[0-9]+$
El problema es que necesito la expresión regular para unDocumentFilter
entonces la entrada solo puede ser números con / sin punto decimal.Pero el problema es que también debe coincidir
1223.
Entonces el usuario puede ingresar el decimal en el campo de texto. Así que básicamente necesito regex para que coincida
11111 // all integer
11111. // all integers with one decimal point and nothing after
11111.1111 // all decimal numbers
El patrón que tengo hasta ahora es el de arriba. Aquí hay un programa de prueba (para usuarios de Java)
El patrón se puede ingresar en esta línea
Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");
Si la expresión regular se ajusta a la factura, podrá ingresar111
o111.
o111.111
.
Ejecutarlo :)
import java.awt.GridBagLayout;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.text.*;
public class DocumentFilterRegex {
JTextField field = new JTextField(20);
public DocumentFilterRegex() {
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");
@Override
public void insertString(DocumentFilter.FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
Matcher matcher = regEx.matcher(str);
if (!matcher.matches()) {
return;
}
super.insertString(fb, off, str, attr);
}
@Override
public void replace(DocumentFilter.FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
Matcher matcher = regEx.matcher(str);
if (!matcher.matches()) {
return;
}
super.replace(fb, off, len, str, attr);
}
});
JFrame frame = new JFrame("Regex Filter");
frame.setLayout(new GridBagLayout());
frame.add(field);
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DocumentFilterRegex();
}
});
}
}
EDITAR:
Mi suposición original de que elstr
Pasé a los métodos el documento completo String, así que estaba confundido acerca de por qué las respuestas no funcionaron. Me di cuenta de que solo se pasó la parte intentada insertada de la Cadena.
Dicho esto, las respuestas funcionan perfectas, si obtiene la Cadena de documento completa de FilterBypass y verifica la expresión regular contra la Cadena de documento completa. Algo como
@Override
public void insertString(DocumentFilter.FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
String text = fb.getDocument().getText(0, fb.getDocument().getLength() - 1);
Matcher matcher = regEx.matcher(text);
if (!matcher.matches()) {
return;
}
super.insertString(fb, off, str, attr);
}