我需要创建一个能够匹配这些数字的正则表达式:
"+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个“\”以避免输入逗号或其他符号而不是点。
新更新:感谢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"
我仍然无法获得“完美”的正则表达式 =)
"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"
提示:检测到无效数字被识别为有效数字:0,123
(\\d{3}\\,){0,5}
替换([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?
(它们是相同的)。 - Bernhard Barker.34
替换为^([+-\\.]?
中的^([\\+\\-]?
。 - Smit