RegEx:Look-behind避免奇数个连续反斜杠

时间:2012-03-08 06:00:02

标签: php regex pcre lookbehind negative-lookbehind

我有用户输入,方括号内允许一些标签。我已经编写了正则表达式模式来查找和验证括号内的内容。

在用户输入字段中,open-bracket可以([)使用反斜杠进行转义,也可以使用另一个反斜杠(\)转义反斜杠。我需要后视子模式以避免在open-bracket之前连续反斜杠的数量。

目前我必须处理这样的事情:

(?<!\\)(?:\\\\)*\[(?<inside brackets>.*?)]

它运行正常,但问题是此代码仍然匹配括号前面可能的连续反斜杠对(即使它们是隐藏的),并且后面只检查是否有另外一个反斜杠附加到对(或直接打开) -托架)。如果可能的话,我需要在后视组内避免它们。

实施例

my [test] string is ok
my \[test] string is wrong
my \\[test] string is ok
my \\\[test] string is wrong
my \\\\[test] string is ok
my \\\\\[test] string is wrong
...
etc

我使用PHP PCRE

2 个答案:

答案 0 :(得分:11)

上次我查看时,PHP不支持可变长度的lookbehinds。这就是为什么你不能使用简单的解决方案(?<![^\\](?:\\\\)*\\)

最简单的解决方法是简单地匹配整个事物,而不仅仅是括号部分:

(?<!\\)((?:\\\\)*)\[(?<inside_brackets>.*?)]

不同之处在于,现在,如果你在preg_replace中使用该正则表达式,你必须记住用$1替换字符串前缀,以恢复那里的反斜杠。

答案 1 :(得分:0)

你可以在没有任何后视的情况下做到这一点( (\\\\|[^\\])交替只吃一个反斜杠):

^(\\\\|[^\\])*\[(?<brackets>.*?)\]