2016-07-27 75 views
1

我与R.用grep/grepl功能面临的问题当我运行[R grepl - 匹配两个字符串

grepl("[Aa][Bb][Cc]x", c("Abcx", "abCy")) 

我:

[1] TRUE FALSE 

而且它的确定。同样,对于:

grepl("[Aa][Bb][Cc]y", c("Abcx", "abCy")) 

我:

[1] FALSE TRUE 

而且,这也是allrighty。但是,当我写:

grepl("[Aa][Bb][Cc]x | [Aa][Bb][Cc]y", c("Abcx", "abCy")) 

它给了我反直觉

[1] FALSE FALSE 

什么问题?

+2

...删除'|'两边的空格吗? – joran

+0

是的,在评论@ user22 – Frank

+0

@joran后才意识到我的错误,谢谢!不过,我不明白,为什么它会在正则表达式中输入空格时考虑空格? – user2280549

回答

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])。

+0

谢谢!不过,我不明白,为什么它会在正则表达式中输入空格时考虑空格?或者它是真的,但只适用于perl式的表达式? – user2280549

+1

请注意'\ s'代表的不仅仅是一个文字空间。它可以匹配空格,制表符,换行符,Unicode空格。默认情况下,文字空间是有意义的,但PCRE(带有'perl = TRUE'的base R)和ICU(stringr/stringi包)正则表达式风格中没有'(?x)'修饰符。 –

+0

据我所知,“\ s”仅代表空格(与[:space:]相对) - >请参阅grepl(“\\ s”,“\\ t”) – user2280549