regex 为什么R `stringr::str_extract('word. 42',pattern = '\\d *')`不生成`“42”`?

z9ju0rcb  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个字符串的形式“字母数字”的向量,我想使用在stringr::str_extract中实现的RegEx模式"\\d*"提取数字。结果非常令人困惑:

# R 4.2.3
# install.packages('stringr')
library(stringr)

# case 1
str_extract('word 42', '\\d*')
# ""

# case 2 (?)
str_extract('42 word', '\\d*')
# "42"

# case 3
str_extract('word 42', '\\d+')
# "42"

# case 4 (?!)
str_extract('word 42', '\\d*$')
# "42"

# case 5
str_extract('42 word', '\\d*$')
# ""

在所有情况下,预期的结果都是"42"。我是RegEx的新手,但pattern = '\\d*'似乎很简单-我将其理解为“匹配任何数量的连续数字字符”。
事实上,它对情况1不起作用,但对情况2起作用,这本身就很违反直觉。然后,当使用pattern = '\\d*$'时,角色似乎颠倒了(情况4和5)。
我已经尝试了更多的其他功能(str_matchstr_match_all),但结果仍然不清楚。
我在其他地方找不到这样一个具体的东西,所以我希望更有经验的R/RegEx用户可以澄清一下到底发生了什么。

fkaflof6

fkaflof61#

我将其理解为“匹配任意数量的连续数字字符”。
任何数字 * 包括零 *。并且它将在模式成功的 * 第一个位置 * 匹配。因为\d*可以成功匹配零位数,所以它永远不会查找字符串开头以外的任何地方。如果那里没有数字,那么您将得到""
最有可能的情况是,您需要\d+,它匹配 * 一个或多个 * 数字。然后,匹配将在没有任何数字的位置失败,您将获得字符串中的第一个数字串。
但是\d*$在第4种情况下也适用,因为它同样在寻找 * 第一个位置 *,其中有零个或多个数字后跟字符串的结尾。它可以匹配字符串结尾的零个数字,但是它没有机会这样做,因为它在找到字符串末尾的位置之前就找到了42之前的位置。在情况5中,字符串的末尾没有数字,因此它必须等待直到末尾,在那里它可以成功匹配零位。

相关问题