免费注册 查看新帖 |

Chinaunix

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

有取舍的split [复制链接]

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-13 17:31 |只看该作者 |倒序浏览
本帖最后由 grshrd49 于 2013-09-13 17:32 编辑

$s = 'a,b,c,d,e,[e1,e2,[e21,e22,e33],e3],f';

你们看这段字符串
我想要分解这段字符串
split /,/,$s;
很容易就完成了
但是我在第一次split的时候 不想拆分[]中的字符串 我该则么处理呢?
[]还会嵌套
谁能给点好的思路

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-09-13 21:47 |只看该作者
这个问题我纠结了一晚,
我的:
  1. my $s = 'a,b,c,d,e,[e1,e2,[e21,e22,e33],e3],f';
  2. my ( $F, @s );
  3. for ( split /,/, $s ) {
  4.     $F ? $s[-1] .= ",$_" : push @s, $_;
  5.     /^\[/ ? $F++ : /\]$/ ? $F-- : undef;
  6. }
  7. say for @s;
复制代码

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2013-09-13 23:07 |只看该作者
本帖最后由 grshrd49 于 2013-09-13 23:09 编辑

回复 2# rubyish

写的秒! for里的第二行 三目中的三目 有点搞脑子!
今天加班有点晚了, 明天我清醒了 要好好研究下你的脚本

我是设想用递归的形式来层层分离括号中的数据, 但是perl在处理字符串的时候不像在处理数组那样, 所以我对这个问题就一直卡在这里

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
4 [报告]
发表于 2013-09-14 23:24 |只看该作者
本帖最后由 snriyt 于 2013-09-15 11:08 编辑


奇怪。。。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2013-09-15 10:34 |只看该作者
这个问题有点复杂,但可以拆成几个相对简单的问题

1. 将 [..]的结构中的逗号替换成别的符号。
2. 将嵌套的结构都替换掉
3. 按照逗号拆分。
4. 将拆分后的内容中的逗号恢复

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-09-15 12:45 |只看该作者
本帖最后由 flw 于 2013-09-15 12:46 编辑

给你们介绍个好玩的
  1. flw@waker:~$ ./ttt.pl 'a,b,c,d,e,[e1,e2,[e21,e22,e33],e3],f'

  2. ### $result: [
  3. ###            'a',
  4. ###            'b',
  5. ###            'c',
  6. ###            'd',
  7. ###            'e',
  8. ###            [
  9. ###              'e1',
  10. ###              'e2',
  11. ###              [
  12. ###                'e21',
  13. ###                'e22',
  14. ###                'e33'
  15. ###              ],
  16. ###              'e3'
  17. ###            ],
  18. ###            'f'
  19. ###          ]
  20. flw@waker:~$ cat ttt.pl
  21. #!/usr/bin/perl

  22. use strict;
  23. use warnings;
  24. use Smart::Comments;

  25. use Parse::RecDescent;

  26. my $parser = new Parse::RecDescent(
  27. <<'EOD'
  28.     chars: /[^,\[\]]+/
  29.     unit: chars | in_bracket
  30.     in_bracket: '[' unit_list ']'       { $return = $item[2] }
  31.     unit_list: unit ',' unit_list       { $return = [ $item[1], @{ $item[3] } ] }
  32.         | unit                          { $return = [ $item[1] ] }
  33.     text: unit_list eos                 { $return = $item[1] }
  34.     eos: /\Z/
  35. EOD
  36. ) or die "compile";

  37. my $s = shift;
  38. my $result = $parser->text( $s ) or die "Bad text!\n";
  39. ### $result
  40. flw@waker:~$
复制代码

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
7 [报告]
发表于 2013-09-15 21:39 |只看该作者
本帖最后由 stanley_tam 于 2013-09-16 00:15 编辑

回复 1# grshrd49
  1. my $s = 'a,b,c,d,e,[e1,e2,[e21,e22,e33],e3],f';
  2. my @parts = ();
  3. push @parts, split /,(?! .* \] )/x, $_  for split m{(:? \[ .* \])}x, $s;
复制代码
只有一个[[]]元素的情况下勉强可以。。{:3_196:}

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
8 [报告]
发表于 2013-09-16 21:13 |只看该作者
回复 7# stanley_tam


其实我最近在看json数组, 哈哈! 所以就想到了这个问题

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
9 [报告]
发表于 2013-09-16 21:15 |只看该作者
本帖最后由 grshrd49 于 2013-09-16 21:16 编辑

回复 5# 104359176


    我有想过这个办法! 但是这个用这个中间方法要是能解决问题 ,其实就可以从根本解决我这个问题. 你说是吗?!?!?!? 哈哈
问题就在于, 很难从嵌套的括号中替换字符串

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
10 [报告]
发表于 2013-09-16 21:19 |只看该作者
回复 6# flw


这段代码则么解释呢?
use Smart::Comments;
use Parse::RecDescent;
这两个包起什么作用阿?!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP