2016-07-27 103 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