仅当不在引号之间时匹配给定序列,考虑转义引号

Match a given sequence only if not between quotes, taking escaped quotes into consideration

我使用下面的正则表达式只匹配一个 given 字符序列,前提是它没有被引号包围——也就是说,如果它后面跟着偶数个引号 (使用积极的前瞻)直到字符串的末尾。

假设我只想匹配单词 section ,前提是它在引号之间 而不是 :

\bsection\b(?=[^"]*(?:"[^"]*"[^"]*)*$)

Working example on RegExr

我如何扩展它以考虑转义引号?也就是说,如果我在链接示例中的引号之间插入 \",结果将保持不变。

使用 pcre 可以 skip 引用的内容:

(?s)".*?(?<!\)"(*SKIP)(*F)|\bsection\b

在字符串正则表达式模式中必须对反斜杠进行三次转义,例如 \\ 以匹配 lookbehind 中的文字反斜杠。或者在单引号模式中双重转义对于这种情况就足够了。

$pattern = '/".*?(?<!\\)"(*SKIP)(*F)|\bsection\b/s';

test at regex101