Regex для DocumentFilter, чтобы соответствовать все десятичное число, но также число с десятичным числом в конце
Вопрос первый: Мне нужно регулярное выражение, чтобы соответствовать111
или же111.
или же111.111
(только цифры aritrarty) дляDocumentFilter
, Мне нужно, чтобы пользователь мог вводить111.
сdecimal
и ничего потом. Не могу понять это правильно.
Все регулярные выражения, которые я нахожу все совпадения простовсе десятичные числа, т.е.
12343.5565
32.434
32
Как это регулярное выражение
^[0-9]*(\\.)?[0-9]+$
Проблема в том, что мне нужно регулярное выражение дляDocumentFilter
поэтому вводом могут быть только числа с / без десятичной точки.Но подвох в том, что он тоже должен соответствовать
1223.
Таким образом, пользователь может ввести десятичное число в текстовое поле. Так что в основном мне нужно регулярное выражение, чтобы соответствовать
11111 // all integer
11111. // all integers with one decimal point and nothing after
11111.1111 // all decimal numbers
Шаблон, который у меня есть, выше. Вот тестовая программа (для пользователей Java)
Паттер может быть введен в этой строке
Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");
Если регулярное выражение соответствует требованиям, вы сможете ввести111
или же111.
или же111.111
.
Запустить его :)
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();
}
});
}
}
РЕДАКТИРОВАТЬ:
Мое первоначальное предположение, чтоstr
Переданные в методы были целиком документ String, поэтому я не понимал, почему ответы не сработали. Я понял, что передается только попытка вставленной части строки.
Тем не менее, ответы работают отлично, если вы получаете всю строку документа из FilterBypass и проверяете регулярное выражение со всей строкой документа. Что-то вроде
@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);
}