java 字符串处理

卑微的码农
  • 5
新手上路,请多包涵

问题描述

取出金额其后紧跟的符号或空格后对应的纯数字(最多两位小数)
符号::、;、$、[、|、*(不分区半角、全角)
例如:订单123456 金额:2300.00 汇率:6.5921
这个应该怎么处理

问题出现的环境背景及自己尝试过哪些方法

相关代码

粘贴代码文本(请勿用截图)

你期待的结果是什么?实际看到的错误信息又是什么?

取出2300.00

回复
阅读 256
4 个回答
✓ 已被采纳
package jamesfan.sf.q1010000040162057;

import java.util.Arrays;
import java.util.Optional;
import java.util.regex.Pattern;

public class Main {
    // 比较宽松的匹配,金额和数字之间的内容一般不会太多,假设最多 3 个字符
    static final Pattern p1 = Pattern.compile("金额.{0,3}?(\\d+(?:\\.\\d{0,2})?)(?![.\\d])");
    // 比较严格的匹配,限定金额和数字之间允许出现的字符,但不限长度
    static final Pattern p2 = Pattern.compile("金额[\s:;$\\[|*:;$[|*]*?(\\d+(?:\\.\\d{0,2})?)(?![.\\d])");

    public static void main(String[] args) {
        String[] cases = new String[] {
            "订单123456 金额:2300.00 汇率:6.5921",
            "订单金额: 1234 其他",
            "金额: 1234.45 这能匹配上的",
            "金额是1234.56,这例子两个模式结果不同",
            "金额: 1234.457 这应该匹配不上,因为小数超 2 位了",
            "这一条金额后面有点长12345,匹配不上,金额和数字间的内容太多"
        };

        Arrays.stream(cases)
            .map(s -> new String[] {s, getAmount(s, p1), getAmount(s, p2)})
            .forEach(ss -> {
                System.out.println(ss[0]);
                System.out.print("    => ");
                System.out.print(Optional.ofNullable(ss[1]).orElse("<None>"));
                System.out.print(" | ");
                System.out.println(Optional.ofNullable(ss[2]).orElse("<None>"));
            });
    }

    private static String getAmount(String s, Pattern pattern) {
        var m = pattern.matcher(s);
        return m.find() ? m.group(1) : null;
    }
}

结果:

订单123456 金额:2300.00 汇率:6.5921
    => 2300.00 | 2300.00
订单金额: 1234 其他
    => 1234 | 1234
金额: 1234.45 这能匹配上的
    => 1234.45 | 1234.45
金额是1234.56,这例子两个模式结果不同
    => 1234.56 | <None>
金额: 1234.457 这应该匹配不上,因为小数超 2 位了
    => <None> | <None>
这一条金额后面有点长12345,匹配不上,金额和数字间的内容太多
    => <None> | <None>

不太清除你符号是啥情况,如果只是取数的话,用正则表达式最合适
(?<=.+?)[0-9.]+

class Scratch {
    public static void main(String[] args) {
        String val = getStr("订单123456 金额$2300.00 汇率:6.5921", "金额");
        System.out.println(val);//2300.00
    }

    public static String getStr(String str, String name) {
        String[] fh = new String[]{"", ":", ":", ";", "$", "[", "|", "*"};//
        Pattern p = Pattern.compile(String.format("(?<=%s[%s])(?<=.\\+?)[0-9.]+", name, Arrays.stream(fh).map(f -> "\\" + f).collect(Collectors.joining("|"))));
        Matcher m = p.matcher(str);
        return m.find() ? m.group() : "";
    }
}
你知道吗?

宣传栏