LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: pupilzeng

如何写括号配对的正则表达式?

[复制链接]
发表于 2004-6-10 09:38:09 | 显示全部楼层

  1. abc{123}}->123}
复制代码

这条不合理,是写错了吗?
我觉得应该是

  1. abc{123}}->123
复制代码

才对。
 楼主| 发表于 2004-6-10 09:56:29 | 显示全部楼层
最初由 BBDD 发表

  1. abc{123}}->123}
复制代码

这条不合理,是写错了吗?
我觉得应该是

  1. abc{123}}->123
复制代码

才对。

哦,这个问题。其实是这样的:我提的这个问题,并不是一个实际中的问题,只是我在编一个程的时候,突然想到了这一点。于是提出来大家商量一下,有没有什么好的解决办法。
刚刚仔细想了想,觉得abc{123}}->123}是不大合理的。我原来的想法是最大匹配。但是这样会有歧义:

  1. abc{123}}{}->123}或者123}}{
复制代码

所以觉得应该是123才毕合适,尽早返回。
发表于 2004-6-10 10:43:31 | 显示全部楼层
解决了:

  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $np;
  4. $np = qr[\{(?:(?>[^{}]+)|(??{$np}))*\}];
  5. my $abcnp = qr/abc($np)/;

  6. print "Please input the string: ";
  7. my $text = <stdin>;

  8. if ($text =~ /^$abcnp/) {
  9.   print "Result is $1\n";
  10. } elsif ($text =~ /^abc(\{.*?\})/){
  11.   print "Result is $1\n";
  12. } else {
  13.   print "No result!\n";
  14. }
复制代码


这个问题可以参考骆驼书中文版的245页。不过那一页上至少有3处印刷错误,大家也要注意了。
发表于 2004-6-10 11:34:41 | 显示全部楼层
必须要下个正确的定义
不然还是容易产生歧义
比如说
abc{123{{456}}{456{}{}123{456}
发表于 2004-6-10 23:25:28 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表