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);
}

Ответы на вопрос(2)

Ваш ответ на вопрос