Regex para DocumentFilter para corresponder a todo número decimal, mas também número com apenas um decimal no final
Qestion First: Preciso regex para combinar111
ou111.
ou111.111
(apenas números aritríticos) para umDocumentFilter
. Eu preciso que o usuário possa inserir111.
com umdecimal
e nada depois. Parece que não está certo.
Todos os Regexes eu acho todos iguaistudo números decimais, ou seja,
12343.5565
32.434
32
Como este regex
^[0-9]*(\\.)?[0-9]+$
O problema é que eu preciso da regex para umDocumentFilter
portanto, a entrada pode ser apenas números com / sem um ponto decimal.Mas o problema é que ele também precisa corresponder
1223.
Assim, o usuário pode inserir o decimal no campo de texto. Então, basicamente, eu preciso me regex para combinar
11111 // all integer
11111. // all integers with one decimal point and nothing after
11111.1111 // all decimal numbers
O padrão que tenho até agora é o padrão acima. Aqui está um programa de teste (para usuários Java)
O alinhador longitudinal pode ser inserido nesta linha
Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");
Se o regex se ajustar à conta, você poderá inserir111
ou111.
ou111.111
.
Executá-lo :)
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:
Minha suposição original de que ostr
passado para os métodos foi o documento inteiro String, então fiquei confuso sobre o porquê das respostas não funcionarem. Percebi que era apenas a parte inserida tentada da String que é passada.
Dito isto, as respostas funcionam perfeitamente, se você obtiver o String inteiro do documento no FilterBypass e verificar o regex com o String inteiro do documento. 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);
}