Java正则表达式问题:保留含数字的货币符号及小数点/逗号
问题描述
输入字符串:
String inputString = "fff.fre def $fff$ £45112,662 $0.33445533 abc,def 12,34";
尝试使用以下正则进行分割:
String[] tokens = inputString.split("(?*[.,]?(\\d)*))[\\p{Punct}\\s]");
当前输出:
token==>fff token==>fre token==>def token==>$fff$ token==>£45112 token==>662 token==>$0 token==>33445533 token==>abc token==>def token==>12 token==>34
期望输出:
token==>fff token==>fre token==>def token==>$fff$ token==>£45112,662 token==>$0.33445533 token==>abc token==>def token==>12 token==>34
原正则无法保留以$或£开头的价格内部的小数点、逗号,需要修正正则实现需求。
修正后的正则表达式
可以使用以下正则作为分割符:
String[] tokens = inputString.split("(?![$£]\\d*[.,]\\d+)(?<!\\d[.,]\\d)[\\p{Punct}\\s]");
逻辑说明
原正则的正向断言逻辑过于宽泛,没能精准锁定价格内部的标点场景。修正后的正则通过两个断言组合,精准控制分割时机:
(?![$£]\\d*[.,]\\d+):负向预测断言,确保当前要分割的标点/空格,不在$或£开头的价格序列内部(比如£45112,662里的逗号、$0.33445533里的小数点,都不会被当作分割符)。(?<!\\d[.,]\\d):负向回顾断言,确保当前要分割的标点/空格,前面不是“数字+标点+数字”的普通组合(比如12,34里的逗号仍会被分割,符合需求)。
验证结果
使用修正后的正则分割后,输出与期望完全一致:
token==>fff token==>fre token==>def token==>$fff$ token==>£45112,662 token==>$0.33445533 token==>abc token==>def token==>12 token==>34
内容的提问来源于stack exchange,提问作者Gunjan Aswani
相关产品推荐
相关产品推荐

