免费注册 查看新帖 |

Chinaunix

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

求正则升级版 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-29 10:13 |只看该作者 |倒序浏览
给括号中间的@#前面都加上空格,括号出现嵌套,
能用一条正则来替换么?
谢谢

12@3(13@3(@4#5)#67)12#3

论坛徽章:
0
2 [报告]
发表于 2012-06-29 10:33 |只看该作者
my $a='12@3(13@3(@4#5)#67)12#3 ';
if($a=~/\(.+\)/)
{
        my $_=$&;
        s/\@/ \@/gx;
        s/\#/ \#/gx;
        $a=~s/\(.+\)/$_/;
        print $a,"\n";
}

论坛徽章:
0
3 [报告]
发表于 2012-06-29 10:47 |只看该作者
这个参照cdtits的就行了啊
perl -e '$text=q{12@3(13@3(@4#5)#67)12#3};while ($text =~ s/(.*\(.*?)(?<! )([\@\#])(?=.*\))/$1 $2/g) {};print $text';
12@3(13 @3( @4 #5) #67)12#3

论坛徽章:
0
4 [报告]
发表于 2012-06-29 10:48 |只看该作者
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $str = '12@3(13@3(@4#5)#67)12#3';
  5. $str =~ s/
  6.     ([\@#])
  7.     (?=
  8.         (
  9.             [^\(\)]+
  10.             |
  11.             \((?2)\)
  12.         )*
  13.         \)
  14.     )
  15. / $1/xg;
  16. die $str;
复制代码
抛砖引玉

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2012-06-29 11:47 |只看该作者
回复 3# ludio333

have some bug ...
$ perl -e '$text=q{12@3(13@3(@4#5)#67)12#3(123@456)};while ($text =~ s/(.*\(.*?)(?<! )([\@\#])(?=.*\))/$1 $2/g) {};print $text';
12@3(13 @3( @4 #5) #67)12 #3(123 @456)
   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2012-06-29 12:00 |只看该作者
本帖最后由 jason680 于 2012-06-29 12:01 编辑

回复 1# 3P主义

try this one

$ echo '12@3(13@3(@4#5)#67)12#3(123@456)' | perl -lape '{s/(\((?:([^()])|(?1))*\))/$x=$1;$x=~s{([@#])}{ \1}g;$x/eg}'
12@3(13 @3( @4 #5) #67)12#3(123 @456)   

论坛徽章:
0
7 [报告]
发表于 2012-06-29 13:31 |只看该作者
楼主,请问你用什么方法判定哪条正则谁快谁慢呢?

论坛徽章:
0
8 [报告]
发表于 2012-06-29 14:36 |只看该作者
回复 5# jason680


    学习了

翻了一下
For example:

                     m{ ( \( )?
                        [^()]+
                        (?(1) \) )
                      }x

                 matches a chunk of non-parentheses, possibly included in
                 parentheses themselves.

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
9 [报告]
发表于 2012-06-29 19:14 |只看该作者
本帖最后由 ttcn_cu 于 2012-06-29 20:38 编辑

印象中括号的精确匹配是这样的

  1. my $rr;
  2. $rr=qr/\(([^()]|(??{($rr)}))*\)/;
  3. $test='12@3(13@3(@4#5)#67)12#3';
  4. $test=~s/($rr)/my $x=$1;$x=~s!([#@])! $1!g;$x/sge;
  5. print $test;
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-07-01 03:21 |只看该作者
好复杂。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP