R:环顾四周

时间:2015-04-13 12:46:46

标签: regex r backreference

我需要匹配任何&#39; r&#39;之前是两个不同的元音。例如,&#39;我们的&#39;或者&#39;梨&#39;会匹配但是&#39; bar&#39;或者&#39; aar&#39;不会告发&#39;吨。我确实设法匹配两个不同的元音,但我仍然无法使后续条件(...)成为随后的“r&#39;”。 (?<=...)r...\\Kr都不会产生任何结果。有什么想法吗?

x <- c('([aeiou])(?!\\1)(?=(?1))')
y <- c('our','pear','bar','aar')
y[grepl(paste0(x,collapse=''),y,perl=T)]
## [1] "our"  "pear"`

3 个答案:

答案 0 :(得分:21)

这两种解决方案似乎有效:

为什么不方式:

x <- '(?<=a[eiou]|e[aiou]|i[aeou]|o[aeiu]|u[aeio])r'
y[grepl(x, y, perl=T)]

\K方式:

x <- '([aeiou])(?!\\1)[aeiou]\\Kr'
y[grepl(x, y, perl=T)]

为什么不方式变体(可能更有效,因为它在之前搜索&#34; r&#34;)

x <- 'r(?<=a[eiou]r|e[aiou]r|i[aeou]r|o[aeiu]r|u[aeio]r)'

或快速排除&#34; r&#34;没有前面两个元音(不测试整个交替)

x <- 'r(?<=[aeiou][aeiou]r)(?<=a[eiou]r|e[aiou]r|i[aeou]r|o[aeiu]r|u[aeio]r)'

答案 1 :(得分:6)

这是一个不太优雅的解决方案:

y[grepl("[aeiou]{2}r", y, perl=T) & !grepl("(.)\\1r", y, perl=T)]

可能有一些角落案例失败,其中第一组在不同位置匹配而不是第二组(将不得不考虑这一点),但有些东西可以让你开始。

答案 2 :(得分:4)

另一个通过否定先行断言。

> y <- c('our','pear','bar','aar', "aa", "ae", "are", "aeer", "ssseiras")
> grep("(?!(?:aa|ee|ii|oo|uu)r)[aeiou][aeiou]r", y, perl=TRUE, value=TRUE)
[1] "our"      "pear"     "ssseiras"

> grep("(?!aa|ee|ii|oo|uu)[aeiou][aeiou]r", y, perl=TRUE, value=TRUE)
[1] "our"      "pear"     "ssseiras"

(?!aa|ee|ii|oo|uu)断言匹配中的前两个字符不是aaee或....或uu。所以这个[aeiou][aeiou]会匹配任何两个元音,但不会重复。这就是我们首先设定条件的原因。 r匹配元音后面的r。