免费注册 查看新帖 |

Chinaunix

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

如何匹配具有嵌套结构的字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-12 08:56 |只看该作者 |倒序浏览
30可用积分
本帖最后由 Perlvim 于 2012-03-12 09:06 编辑
  1. match ( hell ( world ( thanks))) left sensentence
复制代码
用正则表达式匹配 match 最外层的结构
hell ( world ( thanks))
,该如何解决呢?

我记得以前有过类似的帖子,但查不到了,希望这里的高手看看。

最佳答案

查看完整内容

回复 1# Perlvim http://perldoc.perl.org/perlre.html

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-03-12 08:56 |只看该作者
回复 1# Perlvim
  1. perl -le '$str="match ( hell ( world ( thanks))) (()left sensentence) ";
  2. $str =~ m{match (\(((?:(?>[^()]+)|(?1))*)\))};
  3. print $1'
  4. ( hell ( world ( thanks)))
复制代码
http://perldoc.perl.org/perlre.html

论坛徽章:
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
3 [报告]
发表于 2012-03-12 09:38 |只看该作者
Text::Balanced ?
或者用 RE 的递归功能,不过这要把 perlre 看透

论坛徽章:
0
4 [报告]
发表于 2012-03-12 09:44 |只看该作者
看不懂需求。。

论坛徽章:
0
5 [报告]
发表于 2012-03-12 09:55 |只看该作者
看不懂?就是匹配一堆括号,但左括号和右括号的数目必须相等,在左括号等于右括号的地方,停住,匹配结束

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
6 [报告]
发表于 2012-03-12 11:06 |只看该作者
  1. my $expr = '((A,B),C,(D,E))';
  2. print extract('C',$expr),"\n";
  3. print extract('B',$expr),"\n";
  4. print extract('D',$expr),"\n";

  5. sub extract {
  6.     my $char = shift;
  7.     local $_ = shift;
  8.     (my $re=$_)=~s/((\()|(\))|.)/$2\Q$1\E$3/gs;
  9.     return (sort{length $a <=> length $b}(grep/$char/,eval{/$re/},$@ && die $@))[0];   
  10. }
复制代码
http://www.perlmonks.org/index.pl?abspart=1;displaytype=displaycode;node_id=308821;part=1

论坛徽章:
0
7 [报告]
发表于 2012-03-12 13:31 |只看该作者
  1. #!perl

  2. use strict;
  3. use warnings;
  4. use 5.010;
  5. use Regexp::Common qw /balanced/;


  6. my $expr = '((A,B),C,(D,E)) ( hello world )';
  7. my $re = $RE{balanced}{-parens=>'()'};

  8. if ($expr =~ /($re)/) {
  9.     say $1;
  10. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-03-12 14:17 |只看该作者
左括号非贪婪,右括号贪婪就好啦。如:
/.*?\((.*)\).*/

论坛徽章:
0
9 [报告]
发表于 2012-03-12 16:08 |只看该作者
Y龙-鬼 发表于 2012-03-12 14:17
左括号非贪婪,右括号贪婪就好啦。如:
/.*?\((.*)\).*/

这个方法感觉很不错啊

论坛徽章:
0
10 [报告]
发表于 2012-03-12 16:19 |只看该作者
以上的办法只有在特定的情况下有效。

一个包含嵌套结构的字符串,这个嵌套结构可能有几个,可能没有,可能在中间,也可能在开头,还可能在结尾。

例如解析一个 makefile 中的 foreach 函数,或是替换一个 C 代码中带参数的宏。



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP