Regex 具有模式匹配的列表对象“ls()”找到的匹配项太多

Regex 具有模式匹配的列表对象“ls()”找到的匹配项太多,regex,r,Regex,R,我在我的脚本中找到了解决这个问题的方法,如下所示,但为什么会这样呢 使用lspattern=。。。使用通配符会产生比实际匹配更多的结果,除非在*和所寻求的模式之间放置额外的字符或空格 我觉得我缺少了一个基本的模式匹配规则。谢谢你的帮助 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" 虽然涉

我在我的脚本中找到了解决这个问题的方法,如下所示,但为什么会这样呢

使用lspattern=。。。使用通配符会产生比实际匹配更多的结果,除非在*和所寻求的模式之间放置额外的字符或空格

我觉得我缺少了一个基本的模式匹配规则。谢谢你的帮助

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"

虽然涉及到一个类似的问题,但并没有触及问题的核心,这就是:在查找匹配项时,为什么要使用*删除前面的字母?

尝试pattern=b_faa*或pattern=b_fa+或pattern=b_fa.*

简而言之,*将前面的字符视为正则表达式,并检查是否存在任何匹配项,包括该字符的0次或多次重复,类似于@jogo的注释

我的困惑是因为太过直截了当地接受了R help中给出的定义和解释。两者都可以使用?regexp找到

尽管在正则表达式文档中,“正则表达式”是一种描述字符串集(如[[:alnum:])的模式,但正则表达式实际上可以是非元字符(如*或+)的任何单个值,因此,当*放在正则字符前面时,该字符被视为包含单个字符串的正则表达式,并按此方式处理

正如@Frank所说:我用*作为通配符,它不是。
这个时期。匹配任何字符;这是最接近通配符的东西。

请阅读regex的文档。*也是字符的0倍before@jogo:我的理解是,您所描述的*用法是在正则表达式regex之后使用的,在这种情况下,这意味着前面的项将被匹配零次或多次。{regex documentation}。进一步阅读后,我认为我已经解决了这个问题。尽管在正则表达式文档中,“正则表达式”是一种描述*字符串集的模式。正则表达式实际上可以是非元字符的任何单个值,如*或+,因此当*放在正则字符前面时,它将其视为正则表达式,并按照@jogo所描述的方式处理单个字符。实际上,通过编写b_fa*我正在匹配cb_f、b_fa、b_faa、b_faaa等模式。;“是b_f找到了我所有不想要的匹配项。如果你知道以前出了什么问题,你可以自己回答,”DylanS说。我认为关键是*不是一个通配符,而是一个量词。很可能,您想要的正则表达式是^b_fa—任何以这些字符开头的东西—您的模式不必完全匹配字符串。
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.