为什么 R `stringr::str_extract('word.42', pattern = '\d*')` 不产生 `"42"`?

问题描述 投票:0回答:1

我有一个“字母数字”形式的字符串向量,我想使用

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_match
str_match_all
),但结果仍然不清楚。

我在其他地方找不到这样一个特定的东西,所以我希望更多有经验的 R/RegEx 用户可以澄清幕后发生的事情。

r regex stringr
1个回答
1
投票

我理解为“匹配任意数量的连续数字字符”。

任何数字包括零。它将在模式成功的第一个位置匹配。因为

\d*
可以成功匹配零位数字,所以它永远不会查找字符串开头以外的任何地方。如果那里没有数字,那么你会得到
""

最有可能的是,您需要

\d+
,它匹配 一个或多个 数字。然后,匹配将在没有任何数字的位置失败,您将获得字符串中的第一串数字。

但是

\d*$
在情况 4 中对你有用,因为它再次寻找 first position 其中有零个或多个数字后跟字符串结尾。它可以匹配字符串末尾的零位数字,但它没有机会匹配,因为它在找到字符串末尾的位置之前找到了
42
之前的位置。在情况 5 中,字符串末尾没有数字,因此它必须等到末尾,才能成功匹配零数字。

© www.soinside.com 2019 - 2024. All rights reserved.