免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Perlvim
打印 上一主题 下一主题

[字符串匹配算法] 嵌套匹配 [复制链接]

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
11 [报告]
发表于 2013-04-26 11:36 |只看该作者
rubyish和眼镜哥的代码都非常好,能学习到不少东西,如果能加少许注释,我等更受益匪浅了,多谢{:3_193:} 回复 2# rubyish


   

论坛徽章:
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
12 [报告]
发表于 2013-04-26 17:01 |只看该作者
修正了一些錯誤:{:3_188:}

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
13 [报告]
发表于 2013-04-26 17:25 |只看该作者
{:3_186:} 学习了{:3_186:}

论坛徽章:
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
14 [报告]
发表于 2013-04-26 17:33 |只看该作者
本帖最后由 rubyish 于 2013-04-26 13:58 编辑
只是一个红薯 发表于 2013-04-26 07:36
如果能加少许注释,我等更受益匪浅了,多谢 回 ...

少许注释:
  1. sub parse {
  2.     my @data = map /(\S.*\S)/, split /(if|end)/, shift;
  3.     # @data: [ if, a then, if, b then, if, c then d, end, if, e then f, end, end, end ]
  4.     my ( %i, %result );
  5.     $data[$_] =~ /(if|end)/ and push @{$i{$1}}, $_ for 0 .. $#data;
  6.     # %i: { if => [ 0, 2, 4, 7 ], end => [ 6, 9, 10, 11 ] }
  7.     @{$i{if}} = reverse @{$i{if}};
  8.     # reverse $i{if}:
  9.     # %i: { if => [ 7, 4, 2, 0 ], end => [ 6, 9, 10, 11 ] }

  10.     my @L = reverse 0 .. $#{$i{end}};
  11.     # @L: [ 3, 2, 1, 0 ]
  12.     for my $i ( 0 .. $#{$i{end}} ) {
  13.         if ( $i{if}[$i] > $i{end}[$i] ) {
  14.             # 7 > 6
  15.             my $l;
  16.             $i{if}[++$l] < $i{end}[$i] and last for @{$i{if}};
  17.             # find first $i{if}[$l] < $i{end}[$i] 4 < 6; 4:index = $l = 1;
  18.             @{ $i{if} }[ $i .. $l ] = reverse @{$i{if}}[$i .. $l];
  19.             # %i: { if => [ 4, 7, 2, 0 ], end => [ 6, 9, 10, 11 ] }
  20.             @L[$i .. $l] = ($L[$l]) x ($l - $i + 1);
  21.             # @L: [ 2, 2, 1, 0 ]
  22.         }
  23.         my $join = "@data[$i{if}[$i] .. $i{end}[$i]]";
  24.         # 0 .. $#{$i{end}} => 0 .. 3
  25.         # join: if=> 4, end=> 6 = if c then d end
  26.         # join: if=> 7, end=> 9 = if e then f end
  27.         # join: if=> 2, end=> 10 = if b then if c then d end if e then f end end
  28.         # join: if=> 0, end=> 11 = if a then if b then if c then d end if e then f end end end
  29.         push @{$result{$L[$i]}}, $join;
  30.     }
  31.     \%result;
  32. }
复制代码

论坛徽章:
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
15 [报告]
发表于 2013-04-26 17:56 |只看该作者
回复 7# kk861123


    3Q~{:3_203:} {:3_203:}

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
16 [报告]
发表于 2013-04-26 18:15 |只看该作者
  1. and last
复制代码
这种阻塞方式还是第一次看这么用,{:3_200:} 回复 15# rubyish


   

论坛徽章:
0
17 [报告]
发表于 2013-04-26 19:58 |只看该作者
本帖最后由 afukada 于 2013-04-26 19:58 编辑

雖然已解決

不過還是請大家指教一下( <_._> )
  1. use Data::Dumper;

  2. $string="if a then if b then if c then d end if e then f end end end";
  3. @word=split(/\s+/,$string);

  4. foreach $E_word(@word)
  5. {
  6.         $check++,$seq[$check-1]++,$out{$check-1}[$seq[$check-1]-1]="q<" if($E_word eq "if");
  7.         $out{$_}[$seq[$_]-1].=($E_word." ") for(0..$check-1);
  8.         $out{$check-1}[$seq[$check-1]-1]=substr($out{$check-1}[$seq[$check-1]-1],0,length($out{$check-1}[$seq[$check-1]-1])-1).">",$check-- if($E_word eq "end");
  9. }

  10. print Dumper(\%out),"\n";
复制代码
謝謝大家

论坛徽章:
0
18 [报告]
发表于 2013-04-27 09:32 |只看该作者
回复 18# afukada


   你的结果和我的要求最接近。

其实没必要用 q<> 的表示,我的意思是返回这样的数据结构。

另外你的代码也看不懂。

不知道你经常用什么语言写代码,怎么感觉像 awk

论坛徽章:
0
19 [报告]
发表于 2013-04-30 13:01 |只看该作者
不好意思

這幾天比較忙

我平常就是使用perl

其實我用來用去就那幾招而已{:3_203:}

先將每個字切開來

@word=("if","a","then","if","b","then","if","c","then","d","end","if","e","then","f","end","end","end";

然後遇到"if"就將$check + 1,遇到"end"就將$check - 1 (check就是輸出hash的key)

每個對應的value是一個array

而array的index則使用一個@seq來表示,遇到"if"的時候就將對應的$seq[$check]++

當$check=1時$seq[$check]++, 就是$seq[1]=1

所以在$check=3的時後, $check[3]會加兩次

所以上面就會變成這樣

          "if","a","then","if","b","then","if","c","then","d","end","if","e","then","f","end","end","end"
check   1   1    1        2    2    2         3    3    3         3    2       3    3    3        3    2       1        0  
seq[1]  1   1    1                                                                                                          1        1
seq[2]                       1    1    1                                      1                                    1
seq[3]                                               1   1    1         1             2    2    2        2

论坛徽章:
0
20 [报告]
发表于 2013-04-30 14:18 |只看该作者
思路很清晰
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP