小编典典

正则表达式的DocumentFilter可以匹配所有十进制数字,但也可以匹配仅以十进制结尾的数字

java

首先,
我需要使用正则表达式来匹配111111.111.111(仅是国家编号)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]+$");

如果正则表达式符合要求,则可以输入111111.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,所以我对为什么答案不起作用感到困惑。我意识到,传递的只是尝试插入的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);
}

阅读 290

收藏
2020-11-30

共1个答案

小编典典

以下正则表达式可能适用于您:

^[0-9]+[.]?[0-9]{0,}$

量词{0,}将匹配零个或多个数字。

2020-11-30