确保范围内的模式不匹配

时间:2016-05-02 02:09:04

标签: ruby regex pcre onigmo

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

我正在尝试匹配

的子字符串

(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>相矛盾,正则表达式无法匹配。

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

1 个答案:

答案 0 :(得分:1)

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

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