确保范围内的模式不匹配

Ensure non-matching of a pattern within a scope

我正在尝试创建一个正则表达式来匹配字符串的某些部分中的模式,但不匹配字符串的另一部分中的模式。

我正在尝试匹配

(i) 被一对平衡的一个或多个连续反引号包围 `

(ii) 并且不包含与周围模式一样多的连续反引号

(iii) 周围的模式(反引号序列)​​不与其他反引号相邻。

这是 Markdown 语法中内联代码符号语法的一些变体。

匹配示例如下:

"xxx`foo`yyy"               # => matches "foo"
"xxx``foo`bar`baz``yyy"     # => matches "foo`bar`baz"
"xxx```foo``bar``baz```yyy" # => matches "foo``bar``baz"

实现此目的的一个正则表达式是:

/(?<!`)(?<backticks>`+)(?<inline>.+?)\k<backticks>(?!`)/

使用非贪婪匹配。

我想知道我是否可以去掉非贪婪匹配。


这个想法来自于当禁止模式是单个字符时。当我想匹配一个被单引号 ' 包围的子字符串时,其中不包含单引号,我可以执行以下任一操作:

/'.+?'/
/'[^']+'/

第一个使用非贪婪匹配,第二个使用显式非匹配模式[^']

我想知道当禁止模式不是单个字符时是否可以有类似第二种形式的东西。


回到最初的问题,有否定的先行语法(?!),但我不能限制它的有效范围。如果我像这样制作我的正则表达式:

/(?<!`)(?<backticks>`+)(?<inline>(?!.*\k<backticks>).*)\k<backticks>(?!`)/

那么(?!.*\k<backticks>)的作用就不会局限在(?<inline>...)内,而是会扩展到整个字符串。由于这与末尾的 \k<backticks> 相矛盾,因此正则表达式无法匹配。

是否有正则表达式技术来确保在特定范围内不匹配模式(不一定是单个字符)?

您可以搜索一个或多个不是定界符第一个字符的字符:

/(?<!`)(?<backticks>`+)(?<inline>(?:(?!\k<backticks>).)+)\k<backticks>(?!`)/