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

5

我需要创建一个能够匹配这些数字的正则表达式:

 "+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。

完成

最终结果为:

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

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

在这个块中加号会导致用户输入数字,然后输入点,但是后面没有任何内容,从而造成不可能的情况。

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

新更新:感谢user2266098nhahtdh

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"

我仍然无法获得“完美”的正则表达式 =)

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

提示:检测到无效数字被识别为有效数字:0,123


1
这可能会有所帮助:https://dev59.com/83E85IYBdhLWcg3wXCS1 - AllTooSir
1
你可以用(\\d{3}\\,){0,5}替换([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?(它们是相同的)。 - Bernhard Barker
你需要用正则表达式来做这个吗?有一些方法可以调用来完成这个任务。 - Rob Watts
@YaroslavSelivanov 你已经非常接近成功了。将.34替换为^([+-\\.]?中的^([\\+\\-]? - Smit
谢谢。如何将问题标记为已解决? - Yaroslav Selivanov
显示剩余3条评论
2个回答

4

完成

最终结果是:

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

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

在此块中添加加号会导致用户输入数字,然后输入小数点但没有任何内容。

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

新更新:感谢user2266098nhahtdh

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"

我仍然无法获得“完美”的正则表达式 =)

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

提示:检测到无效的数字被视为有效值:0.123


3
这个对于你的所有测试数据都有效:
^(\\+|-)?([1-9]\\d{0,2}|0)?(,\\d{3}){0,}(\\.\\d+)?

顺便说一下,我希望你也希望0.1是一个匹配项,但是你的正则表达式在它上面无法正常工作。由于我无法评论,所以我写在回答中。


1
你的正则表达式将允许空字符串。 - nhahtdh
@user2266098 你量词里面少了一个符号吗? ^(\+|-)?([1-9]\d{0,2}|0)?(,\d{3}){0,}(\.\d+)? - Yaroslav Selivanov
1
@YaroslavSelivanov:我没有详细查看你的问题,所以我不确定。一个粗糙和不好的解决方法是在开头放置一个断言 (?!$) - nhahtdh
@nhahtdh 为什么你称这个解决方案为粗糙和脏?它起作用,但我想了解更多。 - Yaroslav Selivanov
@user2266098 第一个代码块中的"()"与我的数据不正常工作。 - Yaroslav Selivanov
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接