我有一个r字符向量,如下所示:
vec1 = c('AB10', 'B10', 'BMC10', 'BRMC10', 'EC50', 'BMRS10', 'BMD10', 'TC60')
我只想grep()
仅包含两个大写字母和一个10的元素。因此,我尝试了以下正则表达式:
grep('^[A-Z]{,2}10$', vec1, value = T)
[1] "AB10" "B10" "BMC10" "BMD10"
该功能为什么还选择具有三个字母的“ BMC10”和“ BMD10”?
答案 0 :(得分:1)
这似乎可行:
grep('^[A-Z]{1,2}10$', vec1, value = T)
答案 1 :(得分:1)
{}
量词在下面不能无限制。如果您将其制作为{1,2}
或{0,2}
(取决于您想要的内容),那么它将起作用。
我通常建议在https://regex101.com/调试正则表达式。当我放入您的模式时,它带有注释:
{,2}10
从字面上匹配字符{,2}10
(区分大小写)
当我单击“数量词”以获取更多信息时(因为这也让我感到惊讶),我得到了以下示例:
a{3}
恰好是a
中的3
a{3,}
3个或更多a
a{3,6}
,位于a
的3到6之间
请注意,a{,3}
没有选项。
将模式修改为{0,2}
会给出以下注释:
{0,2}
量词-匹配0到2次,尽可能多地匹配,并根据需要返回(贪婪)
也存在正则表达式引擎问题。 regex101.com不支持R的默认正则表达式引擎POSIX 1003.2扩展正则表达式。寻找有关信息,我发现https://www.regular-expressions.info/posix.html,它描述了可用的量词,并建议必须包括最小值。标记为dupe的代码说明默认R引擎忽略量词而没有最小值是一个错误。