首页 > 解决方案 > 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?")

谢谢

标签: rregex

解决方案


我认为它确实返回了一个匹配项,但它是空字符串。

解释:

  1. 正则表达式引擎首先检查第一个字符是否匹配
  2. M不匹配C
  3. 但是等等,这C是可选的。
  4. 空字符串匹配。
  5. 成功!

另一方面CC?,在字符串的开头无法匹配,因此引擎必须逐步遍历字符串,直到找到第一个C,然后无论有多少Cs 都会匹配。

道德:永远不要构建一个所有标记都是可选的正则表达式,允许一个空匹配(除非你打算这样做)。


推荐阅读