Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证数字逗号分隔值的Java正则表达式_Java_Regex_Csv_Numeric - Fatal编程技术网

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

验证数字逗号分隔值的Java正则表达式,java,regex,csv,numeric,Java,Regex,Csv,Numeric,我需要使一个具有以下数字的正则表达式有效: "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123" "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1" "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1

我需要使一个具有以下数字的正则表达式有效:

 "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123"
"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"
"+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".
"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"
"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"
我尝试了此regexp的不同变体:

 "[\\+\\-]?[1-9]{0,3}([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\.][\\d]*)?"
^([\\+\\-]?[1-9]\\d{0,2})*(\\,\\d{3})*([\\.][\\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

检测到有效号码无效:1233456.34

检测到有效号码无效:1345234122123

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

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

更新。多亏了noobunched,我已经升级到这个regexp:

 "[\\+\\-]?[1-9]{0,3}([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\.][\\d]*)?"
^([\\+\\-]?[1-9]\\d{0,2})*(\\,\\d{3})*([\\.][\\d*])?$
现在问题少了:

检测到有效号码无效:1233456.34

有效数字被检测为无效:.34

更新。

regexp:

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

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


完成

最终结果是:

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"
"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"
自上次更新以来的更改是:([.][\d]+)

另外,在这个块中,当用户输入数字,然后在后面加上点,但不加任何内容时,就不可能出现这种情况

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

新更新:感谢用户2266098NHAHDH

user2266098将我的注意力集中在未知的“0.1”数字问题上,并通过在第二个块中添加“|0”来显示解决方案。但是他的regexp不能正确地为我的数据使用“+”和“-”(因为“()”而不是“[]”)。我不喜欢量词“{0,}”而不是“*”,因为它的大小

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

谢谢大家

更新

这种情况有新的条件:

我需要使一个具有以下数字的正则表达式有效:

 "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123"
"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"
"+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".
"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"
"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"
我仍然无法获得“完美”regexp=)


给出:检测到无效数字为有效:0123

最终结果是:

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"
"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"
自上次更新以来的更改是:([.][\d]+)

另外,在这个块中,当用户输入数字,然后在后面加上点,但不加任何内容时,就不可能出现这种情况

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

新更新:感谢用户2266098NHAHDH

user2266098将我的注意力指向了未知的“0.1”数字问题,并通过在第二个块中添加“|0”来显示解决方案。但是他的regexp不能正确使用我的数据的“+”和“-”。我不喜欢量词“{0,}”而不是“*”,因为它的大小

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

谢谢大家

更新

这种情况有新的条件:

我需要使一个具有以下数字的正则表达式有效:

 "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123"
"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"
"+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".
"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"
"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"
我仍然无法获得“完美”regexp=)


给出:无效数字被检测为有效:0123

此数字适用于您的所有测试数据:

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

顺便说一句,我希望你也希望0.1是一个匹配,但你的regexp不工作。我不能评论,所以我在回答中写了这篇文章。这可能会有帮助:你可以用
([\\d]{3}[\\,]{1})替换
([\\d]{3}[\\,]{1})([\\d]{3}[\\,]{1})([\\d]{3}[\\,]{1})([\\d]{3}[\\,]{1})替换
([\\d]{3},{1}>)([\\d]{3},1}),你也需要这样做吗?您可以调用一些方法来完成此操作。这是我的任务,因此我可能不会使用其他方法=(@YaroslavSelivanov),您很快就可以实现。对于
.34
replace
^([\+\-]?
替换为
^([+\.].
您的正则表达式将允许使用空字符串。@user2266098您是否在量词中丢失了一个符号?^(\+\\\\\+\-)?([1-9]\\\\+\\\\\\\\\\-])?)([0,2]);1240)(,\\d{3} )**{0,}**(\\.\\d+)@nhahtdh有没有办法避免这个问题?是的…将允许空字符串。无论如何,这个问题不是关于完美的正则表达式,而是为了通过家庭作业测试。Yaroslav:我没有错过量词。可以有无限数量的(\,\d{3})我想是团体。@YaroslavSelivanov:我还没有详细研究你的问题,所以我不知道。一个粗糙而肮脏的解决办法是在开始时加入一个断言
(?!$)