验证数字逗号分隔值的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“\”以避免输入逗号或其他符号而不是点
新更新:感谢用户2266098和NHAHDH
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“\”以避免输入逗号或其他符号而不是点
新更新:感谢用户2266098和NHAHDH
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:我还没有详细研究你的问题,所以我不知道。一个粗糙而肮脏的解决办法是在开始时加入一个断言(?!$)
。