Java正则表达式,用于验证数字逗号分隔值

时间:2013-04-16 15:52:22

标签: java regex csv numeric

我需要使用这些数字制作正则表达式:

 "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123"

这些无效:

 "++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2".

我尝试了这个正则表达式的不同变体:

 "[\\+\\-]?[1-9]{0,3}([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\.][\\d]*)?"

测试代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class REGEX {
private static final String REGEX = "[\\+\\-]?[1-9]{0,3}([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\.][\\d]*)?";

private static String[] validNumbers = { "+1", "1.0", "1,233",
        "1,233,456.34", "-1", ".34", "1,345,234,122,123" };

private static String[] invalidNumbers = { "++1", "1.0.0", "1,23,3",
        "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2" };

public static void main(String[] args) {
    Pattern pattern = Pattern.compile(REGEX);

    for (String number : validNumbers) {
        Matcher matcher = pattern.matcher(number);
        if (!matcher.matches()) {
            System.out.println("Valid number is detected as invalid: "
                    + number);
        }
    }
    for (String number : invalidNumbers) {
        Matcher matcher = pattern.matcher(number);
        if (matcher.matches()) {
            System.out.println("Invalid number is detected as valid: "
                    + number);
        }
    }
}

}

当控制台为空时,任务完成。 现在我遇到了这样的问题:

检测到有效号码无效:1,233

检测到有效号码无效:1,233,456.34

检测到有效号码无效:1,345,234,122,123

检测到无效号码有效:1。

的问候。抱歉大尺寸。

更新。感谢 Noob UnChained ,我已经进入了这个正则表达式:

^([\\+\\-]?[1-9]\\d{0,2})*(\\,\\d{3})*([\\.][\\d*])?$

现在问题更少了:

检测到有效号码无效:1,233,456.34

检测到有效号码无效:.34

更新

正则表达式:

"([\\+\\-]?[1-9]\\d{0,2})*(\\,\\d{3})*([.][\\d]*)?"

问题:

检测到无效号码有效:1。

FINISHED

最终结果是:

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

自上次更新以来的更改是:([。] [\ d] +)?

加上这个区块在用户输入数字时会产生不可能的情况,然后在它之后放置点数。

新更新:在最后一个块中添加了2“\”,以避免输入逗号或其他符号而不是点。

新更新:感谢 user2266098 nhahtdh

user2266098 将注意力集中在“0.1”号码的未知问题上,并显示向第二个块添加“| 0”的解决方案。但是他的正则表达式与我的数据的“+”和“ - ”无法正常工作(因为“()”而不是“[]”)。我不喜欢量词“{0,}”而不是“*”,因为它的大小。

nhahtdh 将我的注意力集中在空字符串的未知问题上,并用“(?!$)”显示解决方案。

感谢所有人!

更新

这种情况有新的条件:

我需要使用这些数字制作正则表达式:

"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"

这些无效:

"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"

我仍然无法获得“完美”的regexp =)

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

给出:无效的数字被检测为有效:0,123

2 个答案:

答案 0 :(得分:4)

<强> FINISHED

最终结果是:

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

自上次更新以来的更改是:([。] [\ d] +)?

加上这个区块在用户输入数字时会产生不可能的情况,然后在它之后放置点数。

新更新:在最后一个块中添加2“\”以避免输入逗号或其他符号而不是点。

新更新:感谢 user2266098 nhahtdh

user2266098将注意力集中在“0.1”号的未知问题上,并显示了向第二个块添加“| 0”的解决方案。但是对于我的数据,他的正则表达式与“+”和“ - ”无法正常工作。我不喜欢量词“{0,}”而不是“*”因为它的大小。

nhahtdh将注意力集中在空字符串的未知问题上,并用“(?!$)”显示解决方案。

感谢大家!

<强>更新

这种情况有新的条件:

我需要使用这些数字制作正则表达式:

"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"

这些无效:

"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"

我仍然无法获得“完美”的regexp =)

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

给出:无效的数字被检测为有效:0,123

答案 1 :(得分:3)

这个适用于我的所有测试数据:

^(\\+|-)?([1-9]\\d{0,2}|0)?(,\\d{3}){0,}(\\.\\d+)?

btw我希望你也想要0.1匹配,但你的正则表达式不起作用。我无法评论,所以我在回答中写这个