列出对象' ls()'与模式匹配是找到太多匹配

时间:2015-11-05 18:49:46

标签: regex r

我在脚本中找到了解决此问题的方法,如下所示,但为什么会发生?

使用带有外卡的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确实触及了类似的问题,但它并未解决问题的核心问题,即:为什么在找到匹配项时使用*删除之前的字母?

2 个答案:

答案 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所述:我使用*作为外卡,但事实并非如此 句点.匹配任何字符;它是最接近外卡的东西。