首先, 我需要使用正则表达式来匹配111或111.或111.111(仅是国家编号)DocumentFilter。我需要的用户能够输入111.一个decimal并没有什么之后。似乎无法正确解决。
111
111.
111.111
DocumentFilter
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,所以我对为什么答案不起作用感到困惑。我意识到,传递的只是尝试插入的String部分。
str
就是说,如果您从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); }
以下正则表达式可能适用于您:
^[0-9]+[.]?[0-9]{0,}$
量词{0,}将匹配零个或多个数字。
{0,}