Ruby 确保范围内的模式不匹配
我试图创建一个正则表达式,它匹配字符串某个部分的模式,但不匹配字符串另一部分的模式 我正在尝试匹配一个子字符串 (i) 被一个或多个连续反勾号的平衡对包围Ruby 确保范围内的模式不匹配,ruby,regex,pcre,onigmo,Ruby,Regex,Pcre,Onigmo,我试图创建一个正则表达式,它匹配字符串某个部分的模式,但不匹配字符串另一部分的模式 我正在尝试匹配一个子字符串 (i) 被一个或多个连续反勾号的平衡对包围` (ii)且不包括与周围图案中一样多的连续回勾 (iii)周围的图案(反勾号序列)与其他反勾号不相邻 这是标记语法中内联代码表示法的一些变体 匹配的示例如下: "xxx`foo`yyy" # => matches "foo" "xxx``foo`bar`baz``yyy" # => matche
`
(ii)且不包括与周围图案中一样多的连续回勾
(iii)周围的图案(反勾号序列)与其他反勾号不相邻
这是标记语法中内联代码表示法的一些变体
匹配的示例如下:
"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.*)\k(?!`)/
然后,(?!*\k)
的效果将不限于(?…)
内,而是扩展到整个字符串。由于这与末尾的\k
相矛盾,因此正则表达式无法匹配
是否有正则表达式技术来确保某个范围内的模式(不一定是单个字符)不匹配?您可以搜索不是分隔符第一个字符的一个或多个字符:
/(?<!`)(?<backticks>`+)(?<inline>(?:(?!\k<backticks>).)+)\k<backticks>(?!`)/
/(?`+)((?!\k)。+)\k(?!`)/
是否可以进一步简化为/(?`+((?!\k.)+)\k(?!`)/
?这是否相等?就我所尝试的而言,我觉得是这样。(?:(?!\k)。+
被称为一个。根据“何时使用此技术”部分,在无需避免跨过{MID}
部分的情况下,惰性点匹配对应项更有效。Sawa,你不必去掉懒惰的量词,因为它更有效。
/(?<!`)(?<backticks>`+)(?<inline>(?:(?!\k<backticks>).)+)\k<backticks>(?!`)/