gpt4 book ai didi

java - DocumentFilter 的正则表达式匹配所有十进制数字,但也匹配末尾只有小数点的数字

转载 作者:行者123 更新时间:2023-11-29 03:24:34 24 4
gpt4 key购买 nike

Qestion First: I need to regex to match 111 or 111. or 111.111 (just aritrarty numbers) for a DocumentFilter. I need the user to be able to input 111. with a decimal and nothing afterwards. Can't seem to get it right.

我找到的所有正则表达式都只匹配所有十进制数字,即

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 是整个文档字符串,所以我很困惑为什么答案不起作用。我意识到它只是传递了字符串的尝试插入部分。

也就是说,如果您从 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,} 将匹配零个或多个数字。

关于java - DocumentFilter 的正则表达式匹配所有十进制数字,但也匹配末尾只有小数点的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21704583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com