R语言中sub函数使用[0-9]*未按预期工作的原因
问题分析:R语言sub与gsub搭配正则的差异
代码示例
示例1:gsub搭配[0-9]*
> mysentence <- "UK is Beautiful. UK is not the part of EU since 2016" > gsub("[0-9]*", "", mysentence) [1] "UK is Beautiful. UK is not the part of EU since "
示例2:sub搭配[0-9]*
> mysentence <- "UK is Beautiful. UK is not the part of EU since 2016" > sub("[0-9]*", "", mysentence) [1] "UK is Beautiful. UK is not the part of EU since 2016"
示例3:sub搭配[0-9]+
> mysentence <- "UK is Beautiful. UK is not the part of EU since 2016" > sub("[0-9]+", "", mysentence) [1] "UK is Beautiful. UK is not the part of EU since "
问题
使用gsub函数搭配正则表达式[0-9]*时,成功移除了字符串中的数字2016,得到预期结果;但替换为sub函数搭配相同正则表达式时,数字2016未被移除;而使用sub函数搭配[0-9]+时则能正常移除数字。请问为何第二个示例无法得到与其他示例一致的结果?
原因解析
- sub的匹配规则:
sub只执行一次替换,找到第一个匹配项后就停止操作,不会继续扫描后续内容。 [0-9]*的语义:*表示匹配0次或多次数字,这意味着它会优先匹配字符串最开头的「0个数字」(也就是空字符)。sub找到这个空匹配后,直接将其替换为空(等于没修改),就结束了整个替换流程,根本没机会匹配到后面的2016。[0-9]+的差异:+要求匹配1次或多次数字,它不会匹配空字符。扫描字符串时,会跳过前面的非数字内容,直到找到第一个连续数字序列2016,然后完成替换,所以能得到预期结果。- gsub用
[0-9]*生效的原因:gsub会替换所有匹配项,它虽然也会匹配开头的空字符,但会继续扫描整个字符串,直到找到2016这个匹配项并替换为空,最终实现移除数字的效果。
内容的提问来源于stack exchange,提问作者Saniaaa
相关产品推荐
相关产品推荐

