2016-01-07 53 views
2

比方說,我有字符串x <- "AbC",我想在每個字母之間加一個&符。我會假設我可以做gsub("([a-zA-Z])([a-zA-Z])", "\\1 & \\2", x),但是會產生「A & bC」。爲什麼gsub不能識別與正則表達式匹配的第二組字母?這不像gsub只會取代找到的第一場比賽。如果我有x <- "AbC DE"並運行相同的命令,我會得到「A & bC D & E」。gsub不會替換R中的所有預期匹配

我錯過了什麼gsub是在做替換?從上面的兩個輸入中,我會預期輸出「A & b & C」和「A & b & C D & E」。

回答

10

因爲如果一個字符出現在一個匹配中,則正則表達式引擎將不會再匹配相同的字符。也就是說,它不會做重疊的匹配..使用環視來克服這一..

gsub("([a-zA-Z])(?=[a-zA-Z])", "\\1 & ", x, perl=T) 

DEMO

+0

完美解釋。謝謝! – brittenb