我需要匹配任何' r'之前是两个不同的元音。例如,'我们的'或者'梨'会匹配但是' bar'或者' aar'不会告发'吨。我确实设法匹配两个不同的元音,但我仍然无法使后续条件(...
)成为随后的“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"`
答案 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)
断言匹配中的前两个字符不是aa
或ee
或....或uu
。所以这个[aeiou][aeiou]
会匹配任何两个元音,但不会重复。这就是我们首先设定条件的原因。 r
匹配元音后面的r。