R sub / gsub替换首次出现的匹配项

时间:2019-06-08 14:06:57

标签: r regex gsub

在R中,我需要从以下字符串中提取“八”:

this_str <- " Eight years blah blah 50 blah blah, two years blah blah blah."

这是我尝试使用gsub的尝试:

gsub("^.*\\s([^ ]*)\\s(years|months)\\s.*", "\\1", this_str)

但是这将返回“ two”,这对应于gsub()中指示的模式的第二次出现。在其他文章中,据说sub()应该返回第一个匹配项。但是当我使用sub()时,它也会给出“两个”。

2 个答案:

答案 0 :(得分:3)

sub执行一次替换,而gsub执行多次替换。相反,问题在于开头的.* greedy :上升到“两个”(即,包括最后一个匹配项在内的所有匹配项)。相反,我们希望懒惰(请参见here)并尽可能少地匹配:

sub("^.*?\\s([^ ]*)\\s(years|months)\\s.*", "\\1", this_str)
# [1] "Eight"

答案 1 :(得分:2)

在这里,我们可能会使用一个传递可选空格的表达式,以防万一,例如:

(\s+)?(.+?)(\s+)?(years?|months?).*

我们所需的输出在第二个捕获组中:

(.+?)

我们的代码看起来像

gsub("(\\s+)?(.+?)(\\s+)?(years?|months?).*", "\\2", this_str)

Demo

RegEx

如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。

RegEx电路

jex.im可视化正则表达式:

enter image description here