理解R regexp中的先行

Nau*_*umz 7 regex r

我正在尝试使用多个前瞻来模拟R Perl类型正则表达式中的AND运算符grep.但是,我不明白我看到的输出.这是一个示例代码块

a <- c("abcxyz", "abcdef", "defxyz", "abcdefxyz", "xyzdefabc")
grep("(?<=abc)(?=xyz)", a, ignore.case=TRUE, perl=TRUE)  # returns 1
grep("(?=abc)(?=xyz)", a, ignore.case=TRUE, perl=TRUE)  # returns integer(0)
Run Code Online (Sandbox Code Playgroud)

第二行表明字符串中的位置在abc和xyz之间,并匹配'abcxyz'.为什么它不匹配'abcdefxyz'?

在第三行,我试图输出1,4和5,但它返回未找到.为什么会这样?

我正在使用下面的替代解决方案,但我想在处理多个前瞻时使用前瞻来处理排序.

grep("abc.*xyz|xyz.*abc", a, ignore.case=TRUE, perl=TRUE)  # returns 1 4 5 as expected
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 8

(?<=abc)(?=xyz)正则表达式只匹配的位置(地方字符串)是与abcxyz.它会找到匹配abcxyz但不会找到匹配,abcdefxyz因为xyz不会立即跟随abc.

(?=abc)(?=xyz),因为它在随后与应等于3个字母序列的字符串位置匹配模式将不会匹配任何东西abc,并xyz在同一时间,这是不可能的.

你在寻找什么

^(?=.*abc)(?=.*xyz)
Run Code Online (Sandbox Code Playgroud)

或者,为了支持多行输入,添加DOTALL修饰符(?s)(这样也.可以匹配换行符):

(?s)^(?=.*abc)(?=.*xyz)
Run Code Online (Sandbox Code Playgroud)

这些将匹配具有两个abcxyz任何顺序的字符串.

R演示:

a <- c("abcxyz", "abcdef", "defxyz", "abcdefxyz", "xyzdefabc")
grep("^(?=.*abc)(?=.*xyz)", a, ignore.case=TRUE, perl=TRUE)
## => [1] 1 4 5
Run Code Online (Sandbox Code Playgroud)

  • @KarthikS `^` 匹配字符串的开头。我的“^(?=.*abc)(?=.*xyz)”正则表达式匹配包含任意顺序的“abc”和“xyz”的字符串,而正则表达式索引保留在字符串的开头,因为前瞻不是-消费模式。首先检查 `.*abc`,找到匹配项,返回值为 *true*(意味着是,继续尝试附加表达式的其余部分),然后 - 仍然从字符串的开头 - `搜索 .*xyz`。既然找到了并且返回值为true则匹配成功, (2认同)