R正则重复
在阅读R4DS字符串一章时,我对以下正则表达式示例感到困惑:R正则重复,r,regex,R,Regex,在阅读R4DS字符串一章时,我对以下正则表达式示例感到困惑: x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII" str_view(x, "C?") 谢谢我想它确实返回了一个匹配,但它是空字符串 说明: 正则表达式引擎通过检查第一个字符是否匹配来启动 M与C不匹配 但是请稍候,C是可选的 空字符串匹配 成功 另一方面,CC?无法在字符串的开头匹配,因此引擎必须逐步遍历字符串,直到找到第一个C,然后将匹配,无论
x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"
str_view(x, "C?")
谢谢我想它确实返回了一个匹配,但它是空字符串 说明:
M
与C
不匹配C
是可选的CC?
无法在字符串的开头匹配,因此引擎必须逐步遍历字符串,直到找到第一个C
,然后将匹配,无论有多少个C
寓意:永远不要构造一个所有令牌都是可选的正则表达式,允许空匹配(除非您正计划这样做)。这是因为正则表达式引擎会放弃它。只需一个可选字符,您就不必提出任何要求。正则表达式满足位置0,尝试了“C”但未找到,但是可选的
对于这两个字符,硬“C”强制引擎向右移动,因为您实际上是在请求某些东西,而第二个“C”会被抛出,因为它是下一个(可选)字符。stru view(x,“C?”)有一个匹配项,但长度为0。使用base R的函数
regexpr
分析此行为很有帮助
regexpr("C?", x)
# [1] 1
# attr(,"match.length")
# [1] 0
# attr(,"useBytes")
# [1] TRUE
这表明匹配从位置1开始,长度为0。由于C?
表示C
一次或零次,因此它匹配x
开头的空字符串
regexpr("CC?", x)
# [1] 47
# attr(,"match.length")
# [1] 2
# attr(,"useBytes")
# [1] TRUE
相反,regex
CC?
匹配从位置47开始的长度为2的字符串。由于第一个C
是必需的,因此它不能与空字符串匹配。由于?
是贪婪的,CC?
匹配x
的第一个和第二个C
,这很有意义。我知道我的简单C?
的正则表达式有点奇怪,但我很好奇它为什么返回空字符串。非常有用,我现在肯定明白了。非常感谢。
regexpr("CC?", x)
# [1] 47
# attr(,"match.length")
# [1] 2
# attr(,"useBytes")
# [1] TRUE