1

我正在为 JTextField 编写一个自定义 DocumentFilter,它只允许用户输入浮点值。这表示:

  • 0 到 9 个字符
  • 一种 '。' 特点
  • 也可以在开头输入“-”和“+”

我只为除整数之外的所有内容编写了一个,而我的正则表达式只是\D+. 但现在事情变得更复杂了。

我认为具有此特征的浮点数的表达式是[-+]?(\d*[.])?\d+,但在这里使用 just\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);
    }
}

有什么帮助吗?

4

3 回答 3

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]+)$

此正则表达式将匹配一个.末尾带有 a 的数字,而没有任何其他数字。

例子

+1.
-2.
2.
6.3
2323356.342478986756
.5
于 2013-10-09T16:41:06.280 回答
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();
}
于 2013-10-09T16:43:33.047 回答
0

要找到没有指数的有效浮点数,您必须考虑
四种可能的形式:

 \d
 \d .
 \d . \d
    . \d

如果没有某种交替,这是无法做到的。
IMO,最好的方法是这样的正则表达式:

 # [-+]?(?:\d+\.?\d*|\.\d+)

 [-+]? 
 (?:
      \d+ \.? \d* 
   |  \. \d+ 
 )

并将您的边界条件设置为您需要的任何内容。

于 2013-10-09T17:52:49.017 回答