免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11128 | 回复: 22
打印 上一主题 下一主题

出道正则难题,数字千分点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-11 15:18 |只看该作者 |倒序浏览
本帖最后由 黑色阳光_cu 于 2011-03-11 15:19 编辑
  1. my $v = "12321347317347317.12734712347313471324";
  2. $v =~ s/.../.../;
  3. print $v;
复制代码
请写一句正则,把 $v 变成 12,321,347,317,347,317.127,347,123,473,134,713,24 。也就是说,按千分点把数字隔开,注意小数部分是从左到右每3位一组,和整数部分刚好相反。
要求一句正则 s/.../.../ 搞定,不准用 /e 修饰;另外,不管有没有小数部分,不管整数部分和小数部分有几位数字,答案都要正确。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-03-11 16:39 |只看该作者
while ($v =~ s/\d\K(?=\d{3},)|
    ,\d{3}\K(?=\d)|
    \d\K(?=\d{3}\.)|
    \.\d{3}\K(?=\d)|
    \d\K(?=\d{3}$)/,/x) {
    say $v;
}
这样递归思想应该最简单吧,不会一句 s/// 搞定 :mrgreen:

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
3 [报告]
发表于 2011-03-11 16:49 |只看该作者
本帖最后由 blackold 于 2011-03-11 17:19 编辑

回复 1# 黑色阳光_cu


  1 while $v =~ s/(^-?\d+)\K(\d\d\d)|(\..*?\d\d\d)\K(\d)/,$&/;

这个算不算一句s?

论坛徽章:
0
4 [报告]
发表于 2011-03-11 18:46 |只看该作者
本帖最后由 iLRainyday 于 2011-03-11 19:06 编辑
  1. s/(?=(\d\d\d)+\.)|(?<=\.(\d\d\d)+)/,/g;
复制代码
可惜perl不支持任意深度的逆序环视,所以在regexbuddy中,只能够使用.NET或者是JGsoft的regex引擎测试通过。

论坛徽章:
0
5 [报告]
发表于 2011-03-11 18:55 |只看该作者

  1. my $v = "12321347317347317.12734712347313471324";
  2. $v =~ s/\G(?:(?!^\d+$)(?!\d*\.)\d{3}(?!$)\K|\d{0,3}\.\d{3}(?!$)\K|\d*?\K(?!^)(?=(?:\d{3})+(?:\.|$)))/,/g;
  3. warn $v;
复制代码
加 /x 清淅点:
  1. my $v = "12321347317347317.12734712347313471324";
  2. $v =~ s/
  3. \G
  4. (?:
  5.         (?!^\d+$)(?!\d*\.)\d{3}(?!$)\K
  6.         |
  7.         \d{0,3}\.\d{3}(?!$)\K
  8.         |
  9.         \d*?\K(?!^)(?=(?:\d{3})+(?:\.|$))
  10. )
  11. /,/xg;
  12. warn $v;
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-03-12 13:09 |只看该作者

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-03-12 14:33 |只看该作者
本帖最后由 yinyuemi 于 2011-03-12 16:34 编辑

perl还在学,用sed凑凑热闹,呵呵

echo "12321347317347317.12734712347313471324" |sed -r ':a;s/([^,\|\.]{3})([^,\|\.]*$)/\1,\2/;s/^([^,\|\.]*)([^,\|\.]{3})/\1,\2/;ta'
12,321,347,317,347,317.127,347,123,473,134,713,24

perl写得很挫啊,

my $v = "12321347317347317.12734712347313471324";

while ($v =~ /[^,|\.]{3}[^\.|,]*$/)
{$v =~ s/([^,|\.]{3})([^\.|,]*$)/$1,$2/;
while ( $v =~ /^[^,|\.]*[^,|\.]{3}/)
{$v =~ s/(^[^,|\.]*)([^,|\.]{3})/$1,$2/;}
}

print $v;

论坛徽章:
0
8 [报告]
发表于 2011-03-13 05:18 |只看该作者
回复 1# 黑色阳光_cu

1 while $v=~s/(\.(?:\d{3})+)(\d+?)/$1,$2/ or $v=~s/(\d+)((?:\d{3})+?)/$1,$2/;

论坛徽章:
0
9 [报告]
发表于 2011-03-13 10:29 |只看该作者
回复  黑色阳光_cu

1 while $v=~s/(\.(?:\d{3})+)(\d+?)/$1,$2/ or $v=~s/(\d+)((?:\d{3})+?)/$1,$2/;
CrkED 发表于 2011-03-13 05:18


可以放在一个s///里。
  1. 1 while $v=~s/(?|
  2. (\.(?:\d{3})+)(\d+?)
  3. |
  4. (\d+)((?:\d{3})+?))
  5. /$1,$2/x
复制代码

论坛徽章:
0
10 [报告]
发表于 2011-03-13 21:04 |只看该作者
回复 5# 黑色阳光_cu


    \K什么意思,use perl什么版本了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP