Regex, damit DocumentFilter mit allen Dezimalzahlen übereinstimmt, aber auch mit einer Dezimalzahl am Ende

Frage zuerst: Ich muss den regulären Ausdruck anpassen111 oder111. oder111.111 (nur Aritrarty-Nummern) für aDocumentFilter. Ich brauche den Benutzer zur Eingabe111. mit einemdecimal und nichts danach. Kann nicht scheinen, es richtig zu machen.

Alle Regexes, die ich finde, stimmen einfach übereinalle Dezimalzahlen, d.h.

12343.5565
32.434
32

Wie dieser Regex

^[0-9]*(\\.)?[0-9]+$

Das Problem ist, ich brauche die Regex für eineDocumentFilter Die Eingabe kann also nur aus Zahlen mit / ohne Dezimalstelle bestehen.Aber der Haken ist, dass es auch passen muss

1223.

So kann der Benutzer die Dezimalstelle in das Textfeld eingeben. Also muss ich im Grunde Regex, um übereinzustimmen

11111         // all integer
11111.        // all integers with one decimal point and nothing after
11111.1111    // all decimal numbers

Das Muster, das ich bisher habe, ist das obige. Hier ist ein Testprogramm (Für Java-Benutzer)

Das Muster kann in dieser Zeile eingegeben werden

 Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");

Wenn der reguläre Ausdruck zur Rechnung passt, können Sie ihn eingeben111 oder111. oder111.111.

Starte es :)

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

BEARBEITEN:

Meine ursprüngliche Annahme, dass diestr An die Methoden wurde der gesamte Dokument-String übergeben, daher war ich verwirrt, warum die Antworten nicht funktionierten. Mir wurde klar, dass nur der versuchte Teil des Strings übergeben wird.

Die Antworten funktionieren jedoch einwandfrei, wenn Sie den gesamten Dokument-String aus dem FilterBypass abrufen und den regulären Ausdruck mit dem gesamten Dokument-String vergleichen. So etwas wie

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