亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 5097 | 回復(fù): 21
打印 上一主題 下一主題

[字符串匹配算法] 嵌套匹配 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-04-24 19:40 |只看該作者 |倒序?yàn)g覽
30可用積分
進(jìn)行過(guò)許多文本解析之后,發(fā)現(xiàn)有一個(gè)非常有用的算法:在具有嵌套結(jié)構(gòu)的文本中匹配字符串:

字符串: if a then if b then if c then d end if e then f end end end

要求匹配出所有  if .. end 的結(jié)構(gòu), 按照深度保存成一個(gè)散列:

{
    0 => [ q<if a then if b then if c then d end if e then f end end end> ],
    1 => [ q<if b then if c then d end if e then f end end> ],
    2 => [ q<if c then d end>, q<f e then f end>],
}

通常的正則匹配是從內(nèi)層進(jìn)行匹配的,也有用遞歸的算法來(lái)從最外層開(kāi)始計(jì)算。

最佳答案

查看完整內(nèi)容

修正了一些錯(cuò)誤:{:3_188:}

論壇徽章:
7
戌狗
日期:2013-12-15 20:43:38技術(shù)圖書(shū)徽章
日期:2014-03-05 01:33:12技術(shù)圖書(shū)徽章
日期: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聯(lián)賽之青島
日期:2016-03-17 20:36:13
2 [報(bào)告]
發(fā)表于 2013-04-24 19:40 |只看該作者
本帖最后由 rubyish 于 2013-04-26 13:07 編輯

修正了一些錯(cuò)誤:{:3_188:}
  1. #!/usr/bin/perl
  2. use 5.016;

  3. my $s = 'if a then if b then if c then d end if e then f end end end';
  4. sub parse {
  5.     my @data = map /(\S.*\S)/, split /(if|end)/, shift;
  6.     my ( %i, %result );
  7.     $data[$_] =~ /(if|end)/ and push @{$i{$1}}, $_ for 0 .. $#data;
  8.     @{$i{if}} = reverse @{$i{if}};
  9.     my @L = reverse 0 .. $#{$i{end}};
  10.     for my $i ( 0 .. $#{$i{end}} ) {
  11.         if ( $i{if}[$i] > $i{end}[$i] ) {
  12.             my $l;
  13.             $i{if}[++$l] < $i{end}[$i] and last for @{$i{if}};
  14.             @{ $i{if} }[ $i .. $l ] = reverse @{$i{if}}[$i .. $l];
  15.             @L[$i .. $l] = ($L[$l]) x ($l - $i + 1);
  16.         }
  17.         my $join = "@data[$i{if}[$i] .. $i{end}[$i]]";
  18.         push @{$result{$L[$i]}}, $join;
  19.     }
  20.     \%result;
  21. }
  22. my $r1 = parse $s;

  23. say "$_ => ", join ' | ', @{ $r1->{$_} } for sort keys $r1;
復(fù)制代碼

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-04-25 10:04 |只看該作者
本帖最后由 Perlvim 于 2013-04-25 10:06 編輯

rubyish 寫(xiě)的代碼編譯器最喜歡。

論壇徽章:
7
戌狗
日期:2013-12-15 20:43:38技術(shù)圖書(shū)徽章
日期:2014-03-05 01:33:12技術(shù)圖書(shū)徽章
日期: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聯(lián)賽之青島
日期:2016-03-17 20:36:13
4 [報(bào)告]
發(fā)表于 2013-04-25 10:15 |只看該作者
Perlvim 發(fā)表于 2013-04-25 06:04
rubyish 寫(xiě)的代碼編譯器最喜歡。

十分感謝編譯器的錯(cuò)愛(ài)~{:3_188:} {:3_188:} {:3_188:}

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-04-25 10:25 |只看該作者
本帖最后由 kk861123 于 2013-04-25 14:38 編輯

回復(fù) 1# Perlvim

這樣可以嗎?
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Data::Dumper;

  4. my $line = 'if a then if b then if c then d end if e then f end end end';
  5. my @aConds;
  6. if ( $line =~ /^( # GROUP 1
  7.                   if \s*\S+\s* then \s*
  8.                     ( (?1)+  # Recurse to start of GROUP 1
  9.                        |     
  10.                        \S+   
  11.                     ) (?{ unshift @aConds, $2 }) # unshift the string matched in inner
  12.                   \s*end\s*
  13.                 )
  14.                       (?{ unshift @aConds, $1 }) # unshift the string matched in GROUP 1
  15.                 $/x ) {
  16.     print Dumper \@aConds;
  17. }

復(fù)制代碼

論壇徽章:
7
戌狗
日期:2013-12-15 20:43:38技術(shù)圖書(shū)徽章
日期:2014-03-05 01:33:12技術(shù)圖書(shū)徽章
日期: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聯(lián)賽之青島
日期:2016-03-17 20:36:13
6 [報(bào)告]
發(fā)表于 2013-04-25 11:05 |只看該作者
回復(fù) 5# kk861123


很好的解決方案 {:3_203:} {:3_203:}

第一次看到   (?1)  這件寶貝 大牛
它是什么?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2013-04-25 11:47 |只看該作者
回復(fù) 6# rubyish


    perlre中搜"(?PARNO) (?-PARNO) (?+PARNO) (?R) (?0) "
我理解的是pattern捕捉,(?1) 代表了第一個(gè)group中的pattern

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2013-04-25 13:28 |只看該作者
回復(fù) 5# kk861123

結(jié)果對(duì),但沒(méi)看懂。



   

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2013-04-25 14:23 |只看該作者
文本解析的利器:
  1. use Parse::RecDescent;
復(fù)制代碼
  1. #!/usr/bin/perl
  2. use strict; use warnings;
  3. use Data::Dumper;
  4. use Parse::RecDescent;

  5. # define grammar
  6. my $grammar = <<'EOG';
  7. start: condition { $return = [ $item[1] ] }
  8. condition: 'if' expr 'then' condition(s?) 'end' { $return = [ @item[1..5] ] }
  9.          | 'if' expr 'then' code 'end'          { $return = [ @item[1..5] ] }
  10. expr: /\S+/
  11. code: /\S+/
  12. EOG

  13. my $line = 'if a then if b then if c then d end if e then f end end end';
  14. my $parser = new Parse::RecDescent($grammar)
  15.     or die "Compilation error!\n";

  16. my $raConds = $parser->start($line);
  17. print Dumper $raConds;
  18. exit;
復(fù)制代碼
result:
  1. $VAR1 = [
  2.           [
  3.             'if',
  4.             'a',
  5.             'then',
  6.             [
  7.               [
  8.                 'if',
  9.                 'b',
  10.                 'then',
  11.                 [
  12.                   [
  13.                     'if',
  14.                     'c',
  15.                     'then',
  16.                     'd',
  17.                     'end'
  18.                   ],
  19.                   [
  20.                     'if',
  21.                     'e',
  22.                     'then',
  23.                     'f',
  24.                     'end'
  25.                   ]
  26.                 ],
  27.                 'end'
  28.               ]
  29.             ],
  30.             'end'
  31.           ]
  32.         ];
復(fù)制代碼

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2013-04-25 14:39 |只看該作者
回復(fù) 8# Perlvim


    加了點(diǎn)注釋,你再看看?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP