我在使用R中的grep / grepl函数时遇到问题。当我运行
时grepl("[Aa][Bb][Cc]x", c("Abcx", "abCy"))
我得到了:
[1] TRUE FALSE
没关系。同样,对于:
grepl("[Aa][Bb][Cc]y", c("Abcx", "abCy"))
我得到了:
[1] FALSE TRUE
它也很好。但是当我写道:
grepl("[Aa][Bb][Cc]x | [Aa][Bb][Cc]y", c("Abcx", "abCy"))
它让我反直觉
[1] FALSE FALSE
问题是什么?
答案 0 :(得分:4)
您需要删除|
周围的空格:
grepl("[Aa][Bb][Cc]x|[Aa][Bb][Cc]y", c("Abcx", "abCy"))
这些空间很重要。您可以使用PCRE正则表达式但使用(?x)
修饰符(请参阅demo),这样可以在子模式之间引入一些格式化空格,以提高可读性:
grepl("(?x)[Aa][Bb][Cc]x | [Aa][Bb][Cc]y", c("Abcx", "abCy"), perl=TRUE)
或者更好地使用这个较短的版本:
grepl("[Aa][Bb][Cc][xy]", c("Abcx", "abCy"))
模式首先缩小为[Aa][Bb][Cc](x|y)
,因为这些是单个字符,我建议使用字符类((x|y)
- > [xy]
)。