Java中用于解析货币的正则表达式

问题描述 投票:0回答:1

我正在寻找用于解析金额的正则表达式。字符串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)));
    }
java regex
1个回答
0
投票

我认为您可以使用

(?<![\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])";
© www.soinside.com 2019 - 2024. All rights reserved.