我在脚本中找到了解决此问题的方法,如下所示,但为什么会发生?
使用带有外卡的ls(pattern= ...)
会产生比实际匹配更多的结果,除非在*和所寻找的模式之间放置一个额外的字符或空格。
我觉得我错过了一个基本的模式匹配规则。谢谢你的帮助。
b_fa=NULL
b_fb=NULL
b_fc=NULL
b_fd=NULL
ls(pattern="b_fa*")
[1] "b_fa" "b_fb" "b_fc" "b_fd"
ls(pattern=b_fa_*)
[1] "b_fa"
虽然Wrongly Making an Empty Match确实触及了类似的问题,但它并未解决问题的核心问题,即:为什么在找到匹配项时使用*删除之前的字母?
答案 0 :(得分:0)
尝试pattern="b_faa*"
或pattern="b_fa+"
或pattern="b_fa.*"
答案 1 :(得分:0)
简而言之,*将前一个字符视为正则表达式并检查任何匹配,包括该字符的0次或多次重复,类似于@jogo的注释。
我的困惑是由于R中的定义和解释过于文明所致。两者都可以使用?regexp
找到。
Definition:
A ‘regular expression’ is a pattern that describes a set of strings.
Explanation:
A regular expression may be followed by one of several repetition quantifiers:
* The preceding item will be matched zero or more times.
虽然在正则表达式文档中,“A'正则表达式'是一种描述”字符串集“的模式,例如[[:alnum:]]
,但正则表达式实际上可以是任何不是元字符的单个值,例如*
或+
,因此当*
放在常规字符前面时,该字符将被视为包含单个字符串的正则表达式,并按此处理。
正如@Frank所述:我使用*
作为外卡,但事实并非如此
句点.
匹配任何字符;它是最接近外卡的东西。