3
word<-"xyz9874w9874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\1", word )
[1] "xyz874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\2", word )
[1] "9874874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\3", word )
[1] "w874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\4", word )
[1] "9874w"

在我看来:

  • 第一部分 ([az]+) 匹配xyz
  • 第二部分 ([0-9]+) 匹配9874
  • 第三部分 ([az]) 匹配 w
  • 第四部分 (\w) 匹配 9874w

为什么结果不是:

gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\1", word )  
[1] "xyz"  
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\2", word )  
[1] "9874"  
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\3", word )  
[1] "w" 

正确添加*([az]+)([0-9]+)([az])(\w) ,使其变为 ([az]+)([0-9]+)([ az])(\w*),
如果* 我的常规模式中没有,如何理解结果?

4

1 回答 1

3

使用的模式\\w正在寻找任何“单词字符”( == [[:alnum:]_]),而您可能想要寻找实际的“w”:\\w匹配“9”,其余字符“874w”未被替换。如果您想匹配字符串的其余部分,那么第四个捕获组为什么不使用“.+$”呢?

 gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\1", word )
[1] "xyz"
> gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\2", word )
[1] "9874"
> gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\3", word )
[1] "w"
> gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\4", word )
[1] "9874w"

根据潜在问题的未说明“规则”,它可能会增加将“^”作为前导模式字符的特殊性,以便匹配从第一个字符开始。

于 2013-11-02T07:08:48.843 回答