在字符串中最多选择两个字母

时间:2018-11-01 14:42:06

标签: r regex

我有一个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”?

2 个答案:

答案 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引擎忽略量词而没有最小值是一个错误。