如何在perl?</delim>中以通用方式编写[^ <delim>]

时间:2014-01-10 16:00:52

标签: regex perl

我想写一个正则表达式,它会像perl引用的字符串那样提取内容。即:

qx...x

所以我试过

/q(?<delim>.)                            # group 1
 (?<content>                             # group 2
   (?:                                   # group 3
     (?:\g{delim}(*PRUNE)(?!)|[^\\])++   # group 4
   | \\.
   )*+
 )
 \g{delim}
/xm

但是这导致了delim的发现不仅仅是突破了第4组,而是所有其他组合。使用* THEN而不是* PRUNE就像我没有使用任何东西一样。我也在想*那只是一种防止回溯的方法,好像它之前的东西是原子的。在这种情况下不太有用。

我希望能够说,&#34;如果找到\ g {delim},请跳过当前组中的所有其他备选方案,并继续使用该组中的替代方案。例如。使当前组失败并检查外部组是否可以成功。

如果是特定字符(比如%),我可以用[^%\\]++代替第4组。如:

/q%                                      # group 1
 (?<content>                             # group 2
   (?:                                   # group 3
     [^%\\]++                            # group 4
   | \\.
   )*+
 )
 %
/xm

但我希望它是通用的。

有什么想法吗?

现在,忽略大括号,圆括号和括号不会以相同的方式匹配。开放分隔符与结束分隔符相同。

1 个答案:

答案 0 :(得分:2)

只需使用(?:(?!PAT).)*的变体。

/
   q (?<delim>.)
   (?: \\ (?: \\ | \g{delim} )
   |   (?: (?! \g{delim} ) [^\\] )+
   )
   \g{delim}
/sx

与您的一样,不会在q或平衡分隔符(q{...})之后处理空格。