我正在尝试创建一个与字符串某些部分中的模式匹配的正则表达式,但不在字符串的另一部分中。
我正在尝试匹配
的子字符串(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>
相矛盾,正则表达式无法匹配。
是否有正则表达式技术来确保某个范围内的模式(不一定是单个字符)不匹配?
答案 0 :(得分:1)
您可以搜索一个或多个不是分隔符的第一个字符的字符:
/(?<!`)(?<backticks>`+)(?<inline>(?:(?!\k<backticks>).)+)\k<backticks>(?!`)/