- 论坛徽章:
- 0
|
本帖最后由 routesf 于 2013-08-23 11:54 编辑
如下程序,括号{}的递归匹配被DATA中的引号中的一个}干扰,导致最终输出的结果少一个},我试图用(?<!\\)来屏蔽 “dfa-pattern "(ST\x00 01\xC|\x00\xX\x08 00\x\}\x08 0d 0a\x).*";”中的那个导致问题的\},但是不成功,有没有谁用过类似的东西
一个方案是用Text::Balanced,它可以忽略文中处于引号中的{},但是对格式要求比较严格,不如正则灵活,我想用正则来解决这个问题,但是一直没找到可行的方法- #!/usr/bin/perl5.12 -w
- use strict;
- my $ptn_no_keyword = qr/(
- ([\S]+)\s
- (
- \{
- (
- (?:
- (?>[^{}]+)
- |
- (?3)
- )*
- )
- \}
- )
- )/x;
- local $/;
- my $cfg = <DATA>;
- if ($cfg =~ /$ptn_no_keyword/) {
- print "$1\n";
- } else {
- print "Not matched\n";
- }
- __DATA__
- application junos:PCANYWHERE {
- type PCANYWHERE;
- index 121;
- port-mapping {
- port-range {
- tcp 5631;
- udp 5632;
- }
- }
- signature {
- port-range {
- tcp 0-65535;
- udp 0-65535;
- }
- client-to-server {
- dfa-pattern "(ST|\x00 00 00 00\x).*";
- }
- server-to-client {
- dfa-pattern "(ST\x00 01\xC|\x00\xX\x08 00\x\}\x08 0d 0a\x).*";
- }
- min-data 8;
- order 85;
- }
- }
复制代码 |
|