免费注册 查看新帖 |

Chinaunix

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

用PERL如何实现括号的正确匹配,相当于数学中的小括号,请多发表意见!!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-10-25 18:04 |只看该作者
[i=s] 本帖最后由 黑色阳光_cu 于 2010-10-25 18:30 编辑 [/i]

假如是想求值的话,可以这样子:
my $exp = "5*(3+8*(3+4))";
while ($exp =~ /\((?!.*\()(.*?)\)/)
{
        substr($exp, $-[0], $+[0] - $-[0]) = eval($1);
}

$exp = eval($exp);
warn $exp;

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
12 [报告]
发表于 2010-10-26 08:26 |只看该作者
假如是想求值的话,可以这样子:
my $exp = "5*(3+8*(3+4))";
while ($exp =~ /\((?!.*\()(.*?)\)/)
{
...
黑色阳光_cu 发表于 2010-10-25 18:04


不是为了算数学表式式(只是打个比喻哈),如果真是要算$exp=5(3+8(3+4))值,那直接手$ab=eval($exp);就可以了呀
我只是想得到正确匹配(注意是正确匹配)括号内的内容再调用自定义函数运算;
谢谢你的意见!
minirain

论坛徽章:
0
13 [报告]
发表于 2010-10-26 08:52 |只看该作者
不是为了算数学表式式(只是打个比喻哈),如果真是要算$exp=5(3+8(3+4))值,那直接手$ab=eval( ...
minirain 发表于 2010-10-26 08:26



样本长什么样的?要进行什么处理

论坛徽章:
0
14 [报告]
发表于 2013-12-19 08:25 |只看该作者
嵌套
见《精通正杂表达式》 P328

$levelN = qr/ \(( [^()] | (??{ $levelN }) )* \) /x;

论坛徽章:
0
15 [报告]
发表于 2015-10-12 10:20 |只看该作者
同意七楼,用堆栈会简单很多!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2015-10-12 10:58 |只看该作者
严格意义上的正则表达式不会数数。

所以得用扩展的正则表达式才行。

Perl6 干这事儿不是很拿手么?
有人 show 一把吗?

论坛徽章:
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
17 [报告]
发表于 2015-10-12 11:04 |只看该作者
回复 16# flw
您能 show 一把吗? (Perl 5 或 Perl 6)


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2015-10-12 11:17 |只看该作者
Perl5 的话,看看这个:
https://metacpan.org/pod/Parse::RecDescent

Perl6 的话,我也不会了。
不过学学应该很简单吧。

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
19 [报告]
发表于 2015-10-13 09:53 |只看该作者
本帖最后由 minirain 于 2015-10-13 09:54 编辑

回复 18# flw
对这个模块Parse::RecDescent中的‘$grammar’看不明白啊。请FLW抛砖引玉一下,谢谢!
minirain
20151013

   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
20 [报告]
发表于 2015-10-13 13:52 |只看该作者
本帖最后由 104359176 于 2015-10-13 14:00 编辑

这个用 Perl6 会简洁一些:
  1. use v6;

  2. grammar exprs {
  3.   token expr { '(' [ \w+ || <expr> ]+ ')' }
  4.   token TOP { [ \w+ || <expr> ]+ }
  5. }

  6. my $str = 'aa(bb(cc(dd)dd)ff)ee';
  7. exprs.parse($str).say;
复制代码
output:
  1. > perl6 p.p6
  2. 「aa(bb(cc(dd)dd)ff)ee」
  3. expr => 「(bb(cc(dd)dd)ff)」
  4.   expr => 「(cc(dd)dd)」
  5.    expr => 「(dd)」
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP