stringr::str_extract我有一个“字母数字”形式的字符串向量,我想使用在with pattern中实现的 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*$')
# ""
Run Code Online (Sandbox Code Playgroud)
在所有情况下,预期结果都是"42"。我是正则表达式的新手,但这pattern = '\\d*'看起来非常简单 - 我将其理解为“匹配任意数量的连续数字字符”。
它不适用于情况 1 但适用于情况 2,这一事实本身就很违反直觉。然后使用时角色似乎颠倒了pattern = '\\d*$'(案例 4 和 5)。
我对其他函数(str_match和str_match_all)进行了更多实验,但结果仍然不清楚。
我在其他地方找不到这样具体的东西,所以我希望更有经验的 R/RegEx 用户能够澄清幕后发生的事情。
我将其理解为“匹配任意数量的连续数字字符”。
任何数字,包括零。它将在模式成功的第一个位置进行匹配。因为\d*可以成功匹配零位数字,所以它永远不会查找字符串开头以外的任何地方。如果那里没有数字,那么你会得到""。
最有可能的是,您想要的\d+是匹配一位或多位数字。然后,在没有任何数字的位置匹配将失败,并且您将得到字符串中的第一个数字串。
但\d*$在情况 4 中适用,因为它再次寻找第一个位置,其中有零个或多个数字,后跟字符串末尾。它可以匹配字符串末尾的零位数字,但它没有机会这样做,因为它找到了42位于字符串末尾的位置之前的位置。在情况 5 中,字符串末尾没有数字,因此必须等到末尾才能成功匹配零位数字。