我想写一个正则表达式,它会像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
但我希望它是通用的。
有什么想法吗?
现在,忽略大括号,圆括号和括号不会以相同的方式匹配。开放分隔符与结束分隔符相同。
答案 0 :(得分:2)
只需使用(?:(?!PAT).)*
的变体。
/
q (?<delim>.)
(?: \\ (?: \\ | \g{delim} )
| (?: (?! \g{delim} ) [^\\] )+
)
\g{delim}
/sx
与您的一样,不会在q
或平衡分隔符(q{...}
)之后处理空格。