我正在寻找用于解析金额的正则表达式。字符串s10
不匹配。有人可以提供帮助,还是有人可以简化正则表达式?那是我的尝试:
public static String[] getMoney(String s) {
List<String> ret = new ArrayList<String>();
String regex = "((\\d{1,3}[.,]?)(\\d{3}[.,]?)*[.,]\\d{1,2})(\\D|$)";
Pattern pat = Pattern.compile(regex);
Matcher mat = pat.matcher(s);
while (mat.find()) {
ret.add(mat.group(1));
}
return ret.toArray(new String[0]);
}
public static void main(String[] args) {
String s1 = "0,1"; // should match
String s2 = ",1"; // should not match
String s3 = "1,"; // should not match
String s4 = "1.234,01"; // should match
String s5 = "1234,10"; // should match
String s6 = "1234,100"; // should not match
String s7 = "1234,10a"; // should match
String s8 = "123,456,789.10"; // should match
String s9 = "123.456.789,10"; // should match
String s10 = "123,456.789,10"; // should not match (!)
System.out.println(Arrays.toString(getMoney(s1)));
System.out.println(Arrays.toString(getMoney(s2)));
System.out.println(Arrays.toString(getMoney(s3)));
System.out.println(Arrays.toString(getMoney(s4)));
System.out.println(Arrays.toString(getMoney(s5)));
System.out.println(Arrays.toString(getMoney(s6)));
System.out.println(Arrays.toString(getMoney(s7)));
System.out.println(Arrays.toString(getMoney(s8)));
System.out.println(Arrays.toString(getMoney(s9)));
System.out.println(Arrays.toString(getMoney(s10)));
}
我认为您可以使用
(?<![\d,.])(?:\d{1,3}(?:(?=([.,]))(?:\1\d{3})*)?|\d+)(?:(?!\1)[.,]\d{1,2})?(?![,.\d])
请参见regex demo
详细信息
(?<![\d,.])
-无数字,.
或,
左边立即允许](?:\d{1,3}(?:(?=([.,]))(?:\1\d{3})*)?|\d+)
-\d{1,3}(?:(?=([.,]))(?:\1\d{3})*)?
-一,两位或三位数,后跟一个可选的位置,后跟一个逗号或点,然后再出现0个或多个出现的捕获值,然后是任意三位]|\d+
-或1个或多个数字(?:(?!\1)[.,]\d{1,2})?
-逗号或点的可选序列,但与组1中的字符不同,然后是1或2位数字](?![,.\d])
-无数字,.
或,
右边立即允许]在Java中,请不要忘记将反斜杠加倍:
String regex = "(?<![\\d,.])(?:\\d{1,3}(?:(?=([.,]))(?:\\1\\d{3})*)?|\\d+)(?:(?!\\1)[.,]\\d{1,2})?(?![,.\\d])";