我正在为JTextField编写自定义DocumentFilter,这样它只允许用户输入浮点值。这意味着:
除了整数之外,我只写了一个,而我的正则表达式只是\D+
。但是现在这个问题更复杂了。
我认为具有此特征的浮点数的表达式为[-+]?(\d*[.])?\d+
,但仅使用\D
代替\d
在此处不起作用,因为我能够放置超过import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class OnlyFloatDocumentFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) throws BadLocationException {
fb.insertString(off, str.replaceAll("[-+]?(\\D*[.])?\\D+", ""), attr);
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) throws BadLocationException {
fb.insertString(off, str.replaceAll("[-+]?(\\D*[.])?\\D+", ""), attr);
}
}
小数点后一位,+ / - 不允许......
这就是我的代码的样子:
{{1}}
任何帮助?
答案 0 :(得分:3)
首先你找到你的字符串中的所有浮点数,然后你会从找到的最后一个浮点数开始删除它们。你从字符串结尾开始工作到开头的原因是因为这会阻止字符串更改的问题,从而使索引和长度成为一个问题。
因此,使用下面的RegEx查找所有floats
然后只需使用string.remove及其最后找到的索引。
享受
^[-+]?[0-9]*\.?[0-9]+$
/^[-+]?[0-9]*\.?[0-9]+$/gi
^ Start of string
Char class [-+] 0 to 1 times [greedy] matches:
-+ One of the following characters -+
Char class [0-9] 0 to infinite times [greedy] matches:
0-9 A character range between Literal 0 and Literal 9 \. 0 to 1 times [greedy] Literal .
Char class [0-9] 1 to infinite times [greedy] matches:
0-9 A character range between Literal 0 and Literal 9
$ End of string
^[-+]?([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)$
这个正则表达式会匹配最后一个.
的数字而没有任何其他数字。
<强>实施例强>
+1.
-2.
2.
6.3
2323356.342478986756
.5
答案 1 :(得分:2)
public static String removeAllNonFloats(String input){
Matcher matcher = Pattern.compile("[-+]?(?:\\d*[.])?\\d+").matcher(input);
StringBuilder sb = new StringBuilder();
while(matcher.find()){
sb.append(matcher.group(0));
}
return sb.toString();
}
答案 2 :(得分:0)
要找到没有指数的有效浮点数,您必须考虑到 四种可能的形式:
\d
\d .
\d . \d
. \d
如果没有某种交替,这是不可能做到的 IMO,最好的方法是像这样的正则表达式:
# [-+]?(?:\d+\.?\d*|\.\d+)
[-+]?
(?:
\d+ \.? \d*
| \. \d+
)
并将你的边界条件设置为你需要的任何东西。