免费注册 查看新帖 |

Chinaunix

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

字符串截取问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-01 11:50 |只看该作者 |倒序浏览
本帖最后由 beyondlee1 于 2016-12-01 11:51 编辑

请教大神:
我现在有几格式的字符串,如:

1/2 OZ 100KG/卷 1150MM
1/3 OZ 44" 100kg/卷 1118MM
1 OZ 51" 150kg/卷  1285MM
2 OZ  51" 100kg/卷
1/3OZ 51" 100kg/卷
3 OZ 51" 100kg/卷   
1.5 OZ  100kg/卷 1150MM

需要取出 OZ两字前面的数如:1/2,1/3,1,1.5,2,3

还有OZ后面的如 44",没有则忽略

还有"卷"后面的,如1150,1118,1285,没有则忽略

请教大神,怎么写正则?谢谢~!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2016-12-01 14:09 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. while (<DATA>){
  6.     my $str = "";
  7.     ($str, local $_) = split (/\s*OZ\s*(?:44)?/);
  8.     $str .= " 44" if (!/\A\d/);
  9.     $str .= " $1" if (/卷.*?(\d+)/);
  10.     print "$str\n";
  11. }

  12. __DATA__
  13. 1/2 OZ 100KG/卷 1150MM
  14. 1/3 OZ 44" 100kg/卷 1118MM
  15. 1 OZ 51" 150kg/卷  1285MM
  16. 2 OZ  51" 100kg/卷
  17. 1/3OZ 51" 100kg/卷
  18. 3 OZ 51" 100kg/卷
  19. 1.5 OZ  100kg/卷 1150MM
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
3 [报告]
发表于 2016-12-01 14:56 |只看该作者
本帖最后由 sunzhiguolu 于 2016-12-01 15:03 编辑

如果格式固定的话,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. while (<DATA>){
  6.     s/MM\Z//;
  7.     s/\s*OZ\s*(44)?.*卷/defined $1 ? " $1" : ""/e;
  8.     print;
  9. }

  10. __DATA__
  11. 1/2 OZ 100KG/卷 1150MM
  12. 1/3 OZ 44" 100kg/卷 1118MM
  13. 1 OZ 51" 150kg/卷  1285MM
  14. 2 OZ  51" 100kg/卷
  15. 1/3OZ 51" 100kg/卷
  16. 3 OZ 51" 100kg/卷
  17. 1.5 OZ  100kg/卷 1150MM
复制代码

论坛徽章:
0
4 [报告]
发表于 2016-12-01 15:13 |只看该作者
本帖最后由 beyondlee1 于 2016-12-01 15:16 编辑

怎么第二个数全是44?不对啊
还有,

能否不区分OZ的大小写呢?

还有,三个数据分开存放,如,1/2,44,1150,分开三个变量,谢谢~!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
5 [报告]
发表于 2016-12-01 15:48 |只看该作者
本帖最后由 sunzhiguolu 于 2016-12-01 15:49 编辑

哪里不对, 指出来.
perl abc.pl
---------------------
1/2,1150
1/3,44,1118
1,1285
2
1/3
3
1.5,1150
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. while (<DATA>){
  6.     s/MM\Z//;
  7.     s/\s*oz\s*(44)?.*卷/defined $1 ? " $1" : ""/ei;
  8.     print join ",", split /[ \t]+/;
  9. }

  10. __DATA__
  11. 1/2 OZ 100KG/卷 1150MM
  12. 1/3 OZ 44" 100kg/卷 1118MM
  13. 1 OZ 51" 150kg/卷  1285MM
  14. 2 OZ  51" 100kg/卷
  15. 1/3OZ 51" 100kg/卷
  16. 3 OZ 51" 100kg/卷
  17. 1.5 OZ  100kg/卷 1150MM
复制代码

论坛徽章:
0
6 [报告]
发表于 2016-12-01 19:21 |只看该作者
我的数据 oz 后面有 44" ,51"....

你这结果只部分不准确

谢谢~!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-12-02 13:52 |只看该作者
我这里是没有问题的, 不知道你的测试数据怎样?

论坛徽章:
0
8 [报告]
发表于 2016-12-03 11:29 |只看该作者
可能我没有说清楚,

OZ 和100kg之间,有44",51",也有可能没有

现在的结果只是有44“,和空,
没有51"的数据

谢谢~!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2016-12-03 12:31 |只看该作者
将有代表性的示例数据 完整的贴出来一条或者多条, 附上期望的结果 (特别是 有特殊情况的, 说明条件)

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
10 [报告]
发表于 2016-12-03 14:42 |只看该作者
  1. #!/usr/bin/perl
  2. use warnings;
  3. use utf8;

  4. while (<DATA>){
  5.     s/MM\Z//;
  6.     s{\s*oz\s*(44(?:"[^"\n]*+")?)?.*卷}{defined $1 ? " " . $1 =~ s/\D+/ /gr : ""}ei;
  7.     print join ",", split /[ \t]+/;
  8. }

  9. __DATA__
  10. 1/2 OZ 100KG/卷 1150MM
  11. 1/3 OZ 44" 100kg/卷 1118MM
  12. 1/3 OZ 44", 51" 100kg/卷 1118MM
  13. 1 OZ 51" 150kg/卷  1285MM
  14. 2 OZ  51" 100kg/卷
  15. 1/3OZ 51" 100kg/卷
  16. 3 OZ 51" 100kg/卷
  17. 1.5 OZ  100kg/卷 1150MM
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP