用正则表达式处理个字符串

Evenque 2010-06-07 05:28:16

String s1 = "2010-05-07,\"转账\",\"0\",\"00000000000000000\",\"某某公司\",\"2902002109023007384\",\"上交款\",\"3,000.00\",\"0.00\",\"46,440,431.60\"";
s1 = s1.replaceAll("(\"[\\d\\w]*[^\"]),([\\d\\w]*\\.\\d+\")", "$1$2");
s1 = s1.replace("\"", "");
s1 = s1.replace(",", ";");
System.out.println(s1);

我想用上面第二行的正则表达式把s1字符串里"3,000.00"和"46,440,431.60"这样的加千分位符的数处理成不带千分位符的数,目前这个正则表达式能处理加一个千分位符的数,比如"3,000.00",但是加两个以上千分位符比如"46,440,431.60"这样的就不能处理。

谁帮我改改这个正则表达式,这个表达式是我想别人要的。
...全文
283 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
s1.replaceAll("(?:,(?=[0-9]{3}))+", "")
Evenque 2010-06-08
  • 打赏
  • 举报
回复
"xx,xxx,xxx.xx"

归纳下:""号在两侧,里面有,号和.号,x都为0-9的数字,如果有多个,号则,号和,号之间肯定是三位数,肯定有.号,.号后面肯定是两位数。
Evenque 2010-06-08
  • 打赏
  • 举报
回复
To 14楼,
你那个贷款和960之间的逗号没了,这样960就不是单独一个数了。

他这个不能处理: 贷款,100,0,"123,456.78"

这种不超过千位的不加""的情况。
zxczxc1231231231 2010-06-08
  • 打赏
  • 举报
回复
简单万岁
String s1 = "2010-05-07,\"转账\",\"0\",\"00000000000000000\",\"某某公司\",\"2902002109023007384\",\"上交款\",\"3,000.00\",\"0.00\",\"46,440,431.60\"";
s1 = s1.replace(",", "");
s1 = s1.replace("\"", ",\"");
s1 = s1.replace(",\",", "\",");
s1 = s1.replace("\"", "");
s1 = s1.replace(",", ";");
System.out.println(s1);
wakeUpDoNottLazy 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 evenque 的回复:]

引用 12 楼 wakeupdonottlazy 的回复:
引用 6 楼 bao110908 的回复:

s1.replaceAll("(?:,(?=[0-9]{3}))+", "")


这个可以啊,不过,为什么要用 + 呢,
(?:,(?=[0-9]{3}))
不就行了么。麻烦火龙果给解释下啊

不能处理啊,你用
String str = "2010-4-1,转账,0,……
[/Quote]

输出:2010-4-1,转账,0,0,某某有限责任公司,"2904000109048122636",货款960,"100000.90", "31104705.73"

不对么
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wakeupdonottlazy 的回复:]
引用 6 楼 bao110908 的回复:

s1.replaceAll("(?:,(?=[0-9]{3}))+", "")


这个可以啊,不过,为什么要用 + 呢,
(?:,(?=[0-9]{3}))
不就行了么。麻烦火龙果给解释下啊
[/Quote]
不能处理啊,你用
String str = "2010-4-1,转账,0,0,某某有限责任公司,\"2904000109048122636\",货款,960,\"100,000.90\",\"31,104,705.73\"";
试试看。
wakeUpDoNottLazy 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]

s1.replaceAll("(?:,(?=[0-9]{3}))+", "")
[/Quote]

这个可以啊,不过,为什么要用 + 呢,
(?:,(?=[0-9]{3}))
不就行了么。麻烦火龙果给解释下啊
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lunbing 的回复:]
你这些字段怎么有的加双引号,有的又不加啊,这种“货款,960,0,”就应该用双引号啊

[/Quote]
两种情况,有的不超过千位的就不加双引号,比如:960,0,"123,456.00"
也有全部加了双引号的,比如:"0.00","100.00","21,345,678.99"

所以下载只要把"x,xxx,xxx.xx"或者"xxx,xxx.xx"这种格式的处理,归纳下就是有x为数字,有双引号,有逗号,如果有几个逗号,逗号与逗号之间是三个数。


可参照下这个帖子:
http://topic.csdn.net/u/20100531/14/ea8d087e-3810-43fd-bb4e-e33ece0e54ab.html
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]
Java code

public static void main(String args[]){
String s1 = "2010-05-07,\"转账\",\"0\",\"00000000000000000\",\"某某公司\",\"2902002109023007384

\",\"上交款\",\"3,000.00\",\"0.00\",\"46,440,431……
[/Quote]
也有点毛病:
比如
s1== "2010-06-01,\"汇划\",\"资金汇划补充凭证\",\"00000000005033220\",\"\",\"\" ,\"代收E44755704\",\"0.00\",\"117,368.50\",\"4,187,587.46\"";
就不能处理。
lunbing 2010-06-08
  • 打赏
  • 举报
回复
你这些字段怎么有的加双引号,有的又不加啊,这种“货款,960,0,”就应该用双引号啊
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]
s1.replaceAll("(?:,(?=[0-9]{3}))+", "")
[/Quote]
不行,不能处理。
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lunbing 的回复:]
很简单:
s1 = s1.replaceAll("(\\d+),(\\d)", "$1$2");
[/Quote]
你这个能处理"xxx,xxx,xxx.xx"的格式,但是把其他不是这种格式的也处理了。

比如,超过1000的数才会有"xx,xxx,xx.xx"这样的格式,比如:
s1 = "2010-4-1,转账,0,0,某某有限责任公司,\"2904000109048122636\",货款,960,0,\"31,104,705.73\"";
这里,你这个正则表达式,把960,0也处理成了9600了。其实应该是:960,0,"31104705.73"

现在我想用个正则表达式,把"xx,xxx,xx.xx"或者"xx,xxx.xx"这两种格式里的逗号去掉,注意是带""号的。

  • 打赏
  • 举报
回复
我很讨厌在问正则表达式东西的时候,开始不说清楚,等别人都写好了,添点东西,然后写好了再添加点东西。

曾经回复过一个正则表达式问题,反反复复来回过五次!4 个小时的时间全浪费在那帖子上了。从此就不再回复需求不明的正则表达式问题了。

我对正则表达式问题最低的要求:

1,正则表达式是一种模式匹配,是根据字符串的规律来操作的,因此需要详细说明具体要做些什么;
2,对于查找的问题,详细说明寻找字符串的特征是什么,这些字符串的边界是什么,或者说有些什么规律;
3,对于替换的问题,详细说明原串是什么,替换后是什么,有些什么规律;
4,对于验证的问题,详细说明验证的格式是什么;
5,举两三个覆盖范围尽可能广的示例。需要注意的是,所回复的正则表达式仅仅能满足所提供的示例


如果开始不说清楚,等到写完了再改,哪怕是一个小的改动,就得重写、重新考虑。
wakeUpDoNottLazy 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bao110908 的回复:]

引用 8 楼 evenque 的回复:

引用 6 楼 bao110908 的回复:
s1.replaceAll("(?:,(?=[0-9]{3}))+", "")

不行,不能处理。


那为什么我测试是可以的?


[/Quote]

那是因为 LZ 又有新的需求了:

[Quote=引用 13 楼 evenque 的回复:]
不能处理啊,你用
String str = "2010-4-1,转账,0,0,某某有限责任公司,\"2904000109048122636\",货款,960,\"100,000.90\", \"31,104,705.73\"";
试试看。
[/Quote]

根据你的改了改就可以了。
不过我想问下你啊,(?:,(?=[0-9]{3}))+ 你最后的 + 是什么作用呢
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 evenque 的回复:]

引用 6 楼 bao110908 的回复:
s1.replaceAll("(?:,(?=[0-9]{3}))+", "")

不行,不能处理。
[/Quote]

那为什么我测试是可以的?

public class LogAnalysisMain {

public static void main(String[] args) throws IOException {
String s1 = "2010-05-07,\"转账\",\"0\",\"00000000000000000\",\"某某公司\",\"2902002109023007384\",\"上交款\",\"3,000.00\",\"0.00\",\"46,440,431.60\"";
System.out.println(s1);
s1 = s1.replaceAll("(?:,(?=[0-9]{3}))+", "");
System.out.println(s1);
}
}

输出:

2010-05-07,"转账","0","00000000000000000","某某公司","2902002109023007384","上交款","3,000.00","0.00","46,440,431.60"
2010-05-07,"转账","0","00000000000000000","某某公司","2902002109023007384","上交款","3000.00","0.00","46440431.60"

Evenque 2010-06-08
  • 打赏
  • 举报
回复
18楼OK~~~
zxczxc1231231231 2010-06-08
  • 打赏
  • 举报
回复
我以为 不管 数据 还是 字符 都以 “内容” 的形式 分解
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zxczxc1231231231 的回复:]
引用 15 楼 zxczxc1231231231 的回复:
简单万岁
String s1 = "2010-05-07,\"转账\",\"0\",\"00000000000000000\",\"某某公司\",\"2902002109023007384\",\"上交款\",\"3,000.00\",\"0.00\",\"46,440,431.60\"";
s1 = s1.replace(",",……
[/Quote]

如果:
s1 = "2010-06-01,\"汇划\",\"资金汇划补充凭证\",\"00000000005033220\",\"\",\"\" ,\"代收E44755704\",0,117.50,\"4,187,587.46\"";
你这个就不能把0和117.50 区分开来。
Evenque 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wakeupdonottlazy 的回复:]
s1.replaceAll("(?:,(?=\\d{3}(?:,\\d{3})*(?:\\.\\d+)?\"))", "")
[/Quote]

这个可以,目前没发现错误。
zxczxc1231231231 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zxczxc1231231231 的回复:]
简单万岁
String s1 = "2010-05-07,\"转账\",\"0\",\"00000000000000000\",\"某某公司\",\"2902002109023007384\",\"上交款\",\"3,000.00\",\"0.00\",\"46,440,431.60\"";
s1 = s1.replace(",", "");
s1 = s1.replace("\"", ",……
[/Quote]
这个可以 解决楼上没 解决的 给分吧 楼主
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧