You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则表达式问题:保留含数字的货币符号及小数点/逗号

问题描述

输入字符串:

String inputString = "fff.fre def $fff$ £45112,662 $0.33445533 abc,def 12,34";

尝试使用以下正则进行分割:

String[] tokens = inputString.split("(?![$£](?=(\\d)*[.,]?(\\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:25:23