R 在一个字符串中最多选择两个字母
我有一个r字符向量,如下所示:R 在一个字符串中最多选择两个字母,r,regex,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”有三个字母?这似乎有效
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”有三个字母?这似乎有效:
grep('^[A-Z]{1,2}10$', vec1, value = T)
{}
量词不能在下面无界。如果将其设置为{1,2}
或{0,2}
(取决于所需内容),它将正常工作
我通常建议在调试regex。当我输入你的模式时,它注释如下:
{,2}10
逐字匹配字符{,2}10
(区分大小写)
当我点击“量词”获取更多信息时(因为这也让我吃惊),我得到了以下示例:
a{3}
正好是a
a{3,}
a3个或更多
a{3,6}
介于a的3和6之间
注意,a{,3}
没有选项
将模式修改为{0,2}
会生成此注释:
{0,2}
量词-匹配0到2次,尽可能多次,根据需要返回(贪婪)
还有正则表达式引擎问题。regex101.com不支持R的默认正则表达式引擎POSIX 1003.2扩展正则表达式。我想了解一下这方面的信息,它描述了可用的量词,并建议必须包含最小值。标记的dupe说明默认的R引擎忽略没有最小值的量词是一个错误。true。但是我希望
{,2}
也有同样的行为。尽管我不得不承认,我还没有看过手册。然而,这表明it@andrasz还请注意,已更新为不包含{,n}
{,2}10与字符{,2}10按字面意思匹配(区分大小写)
为什么存在任何匹配{,2}
没有文字字符串那么突出……非常好。一定是发动机的东西。regex101默认为PCRE,如果我在grep
中设置perl=TRUE
,那么结果是一致的-与{,2}
没有匹配。regex101没有R默认的POSIX 1003.2扩展正则表达式选项。请参阅dupe,看起来Wiktor已经解决了这个问题,它被认为是一个bug。@andrasz我已经向dupe线程添加了一个。@andrasz否,不要删除。副本是指向原始答案的有用指针,其中包含最详细的答案,使它们更容易找到。