DocumentFilter的正则表达式匹配所有十进制数,但最后只有一个小数

时间:2014-02-11 14:27:56

标签: java regex swing numbers documentfilter

  

Qestion First :我需要正则表达式匹配111111.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

我到目前为止的模式是上面的模式。这是一个测试程序(For Java users)

可以在此行中输入模式

 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的插入部分。

也就是说,如果从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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

我会使用正则表达式

^\d+\.?\d*$

此处的解释和演示:http://regex101.com/r/iM3nX5

确保双重转义转义序列,如下所示:

Pattern regEx = Pattern.compile("^\\d+\\.?\\d*$");