Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R正则重复_R_Regex - Fatal编程技术网

R正则重复

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,然后将匹配,无论

在阅读R4DS字符串一章时,我对以下正则表达式示例感到困惑:

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