首先,
我需要使用正则表达式来匹配111
或111.
或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]+$");
如果正则表达式符合要求,则可以输入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部分。
就是说,如果您从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,}
将匹配零个或多个数字。
问题内容: 首先, 我需要使用正则表达式来匹配或或(仅是国家编号)。我需要的用户能够输入一个并没有什么之后。似乎无法正确解决。 我发现所有正则表达式都匹配 所有 十进制数字,即 像这个正则表达式 问题是,我需要一个正则表达式,因此输入只能是带/不带小数点的数字。 但是要抓住的是它也需要匹配 因此,用户可以在文本字段中输入小数。所以基本上我需要用正则表达式来匹配 到目前为止,我的模式就是上面的模式。
我试图写一个正则表达式来匹配三个组,在三个组中,我希望有一个组是可选的。 正则表达式: 它匹配以下内容: 但是,不是在下面。 如何修改正则表达式,使其匹配两个组。如果第一条消息是三个组。 修复 测试 消息 如果是第二条消息,只有两组 < li >修复 < li >消息 消息
问题内容: 给定以下内容: 我想捕捉: 什么Java正则表达式可以让我做到这一点? 我已经尝试过了,它对于“约翰·史密斯(123)”和“约翰·史密斯(123)(456)”都适用,但是对“约翰·史密斯”却不起作用。如何更改正则表达式以使其也可用于第一个输入? 问题答案: 您可以将第一个懒惰的人变成懒惰的人,然后用一个非捕获的可选组来包裹后面的部分: 参见正则表达式演示 实际上,如果将正则表达式与最后
问题内容: 我有一串 字符串1 (不包括引号)->“我的车号是# 8746253 ,这实际上很酷” 条件-数字8746253可以是任意长度,并且 -数字也可以紧跟在行尾。 我要分组 8746253 ,不应在其后加上点“”。 我努力了, 。#(\ d +)[^。]。 这可以肯定地得到我的数字,但是即使有一个点也可以匹配,因为[。^]将匹配数字的最后一位(例如,在下面的情况下为 3 ) 字符串2 (不
问题内容: 我想匹配一个15位数字(作为较大的正则表达式字符串的一部分)。现在,我有 但我觉得必须有一种更清洁的方法来做到这一点。 问题答案: 如果您正则表达式语言是Perl兼容的:。 在不知道要使用此代码段的外部上下文的情况下,很难说出如何处理边缘(因此您不会意外地抓住多余的数字)。最终的上下文无关解决方案是这样的: 您可以将其放在任何正则表达式的中间,它将匹配(并且仅匹配)一个精确的15位数字
问题内容: 我写了一个正则表达式来匹配任何数字: 正面和负面的 小数 实数 以下正则表达式效果不错,但有一个缺点 对于 + 或 - 等输入也为正。任何指针将不胜感激。谢谢。 正则表达式应与以下输入配合使用 5,+ 5,-5、0.5,+ 0.5,-0.5,.5,+。5,-。5 并且不应该与以下输入匹配 + -- +。 - 。 这是tchrist的回答,很完美。 问题答案: 如果您想要一个看起来像C浮