r - R 正则表达式重复
问题描述
通过 R4DS 字符串章节,我对以下正则表达式示例感到困惑:
x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"
str_view(x, "C?")
此代码不返回匹配项
使用?
我的理解指定匹配 0 或 1 次,重复是“贪婪”并且将匹配可能的最长字符串,那么为什么不匹配 1“C”?
此外,以下代码与第一个“CC”匹配:
x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"
str_view(x, "CC?")
谢谢
解决方案
我认为它确实返回了一个匹配项,但它是空字符串。
解释:
- 正则表达式引擎首先检查第一个字符是否匹配
M
不匹配C
。- 但是等等,这
C
是可选的。 - 空字符串匹配。
- 成功!
另一方面CC?
,在字符串的开头无法匹配,因此引擎必须逐步遍历字符串,直到找到第一个C
,然后无论有多少C
s 都会匹配。
道德:永远不要构建一个所有标记都是可选的正则表达式,允许一个空匹配(除非你打算这样做)。
推荐阅读
- reactjs - 使用 gatsby-plugin-mailchimp 将地址信息发送到 mailchimp
- kotlin - 在 kotlin DSL 中访问 teamcity 参数
- laravel - Laravel 护照延长访问令牌的过期时间
- sql - 以第三个表为条件连接两个表
- r - 在 R 中使用 ggplot2 向饼图图例添加值
- python - 计算 Pandas 数据框中的行之间的差异
- javascript - 具有多个属性的排序数组(降序日期,名称)
- ssl - gRPC ssl上下文配置
- javascript - http请求的默认超时时间是多少?
- python - ValueError: int() 以 10 为基数的无效文字:''但在调试器中它有一个值