2016-01-07 49 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