正则表达式找到aa但不是aaa与grep

时间:2017-04-03 00:36:17

标签: r regex

无法找出匹配aa但不是aaa的正则表达式模式。

x <- c("ab", "abc", "abcc", "abccc", "abcccc", "abccccc")

grep(pattern="c{2,3}", x, value=TRUE, perl=TRUE)
## [1] "abcc"    "abccc"   "abcccc"  "abccccc"

grep(pattern="^((?!c{4,}).)*$", x, value=TRUE, perl=TRUE)
## [1] "ab"    "abc"   "abcc"  "abccc"

但是产生的模式是什么:

grep(pattern=..., x, value=TRUE, perl=TRUE)
## [1] "abcc"  "abccc"

2 个答案:

答案 0 :(得分:2)

这适用于您的测试用例:

^[^c]+c{2,3}$

答案 1 :(得分:1)

  

但是产生1“abcc”“abccc”

的模式是什么

您需要确保2 {3} c不在c之前或之后:

grep(pattern="(^|[^c])c{2,3}([^c]|$)", x, value=TRUE)

<强>详情:

  • (^|[^c]) - 匹配字符串开头(^锚)或除c以外的任何字符的替换组(带有否定字符类(括号表达式)[^c]
  • c{2,3} - 2或3 c s
  • ([^c]|$) - 匹配字符串结尾($锚)或除c以外的任何字符的替换组

或者,如果c实际上是多字符子字符串的占位符,请使用带有外观的PCRE正则表达式:

grep(pattern="(?<!c)c{2,3}(?!c)", x, value=TRUE, perl=TRUE)

请参阅R demo

如果在{2} {3}之前有一个(?<!c),并且c否定预测在比赛中失败,则c否定后卫会使比赛失败{2} (?!c)之后的c