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

Posted

技术标签:

【中文标题】用于验证数字逗号分隔值的 Java 正则表达式【英文标题】:Java regular expression to validate numeric comma separated values 【发布时间】:2013-04-09 02:59:09 【问题描述】:

我需要使这样的数字有效的正则表达式:

 "+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);
        
    

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

有效号码被检测为无效:1233

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

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

无效数字被检测为有效:1。

问候。对不起,尺寸太大了。

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

^([\\+\\-]?[1-9]\\d0,2)*(\\,\\d3)*([\\.][\\d*])?$

现在问题更少了:

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

有效号码被检测为无效:.34

更新。

正则表达式:

"([\\+\\-]?[1-9]\\d0,2)*(\\,\\d3)*([.][\\d]*)?"

问题:

无效数字被检测为有效:1。

完成

最终结果是:

"(?!$)[\\+-]?([1-9]\\d0,2|0)?(\\,\\d3)*(\\.\\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]\\d0,2|0)?(\\,\\d3)*(\\.\\d+)?"

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

【问题讨论】:

这可能会有所帮助:***.com/questions/2811031/… 您可以将([\\d]3[\\,]1)?([\\d]3[\\,]1)?([\\d]3[\\,]1)?([\\d]3[\\,]1)?([\\d]3[\\,]1)? 替换为(\\d3\\,)0,5(它们是相同的)。 您需要使用正则表达式吗?您可以调用一些方法来执行此操作。 这是我的任务,所以我可能不会用其他方式=( @YaroslavSelivanov 你非常接近实现。对于.34,将^([\\+\\-]? 替换为^([+-\\.]? 【参考方案1】:

完成

最终结果是:

"(?!$)[\\+-]?([1-9]\\d0,2|0)?(\\,\\d3)*(\\.\\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]\\d0,2|0)?(\\,\\d3)*(\\.\\d+)?"

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

【讨论】:

【参考方案2】:

这个对你所有的测试数据都适用:

^(\\+|-)?([1-9]\\d0,2|0)?(,\\d3)0,(\\.\\d+)?

顺便说一句,我希望您也希望 0.1 成为匹配项,但您的正则表达式不适用于它。我无法发表评论,所以我在答案中写了这个

【讨论】:

您的正则表达式将允许空字符串。 @user2266098 你在量词中丢失了一个符号吗? ^(\\+|-)?([1-9]\\d0,2|0)?(,\\d3)**0,**(\\.\\ d+)? @nhahtdh 有什么办法可以避免这种情况吗? 是的...将允许空字符串。无论如何,问题不是关于完美的正则表达式,但遗憾的是只是为了通过作业测试。雅罗斯拉夫:我没有错过量词。我认为可以有无数个 (\,\d3) 组。 @YaroslavSelivanov:我没有详细看过你的问题,所以我不知道。一个粗鲁而肮脏的解决方法是在开头放置一个断言(?!$)

以上是关于用于验证数字逗号分隔值的 Java 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用逗号作为小数分隔符的数字的 Google 表单正则表达式

java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

简单的js正则表达式问题

Java 只有数字,字母,下划线,横杆,英文逗号的正则表达式

正则表达式将数字转换为逗号分隔的数字,可选两位小数

通过正则表达式获取逗号分隔的数字