←
PDF 245 / 520 - comments = TRUE allows you to use comments and white space to make complex regular expressions
→
English · PDF 245
Original PDF page 245
中文 · PDF 245
  • comments = TRUE 允许你使用注释和空白来让复杂的正则表达式更易于理解。空格会被忽略,# 之后的所有内容也会被忽略。要匹配字面空格,你需要对其进行转义:"\ ".

phone <- regex(" \(? # 可选的左括号 (\d{3}) # 区号 [)- ]? # 可选的右括号、连字符或空格 (\d{3}) # 另外三个数字 [ -]? # 可选的空格或连字符 (\d{3}) # 再三个数字 ", comments = TRUE) str_match("514-791-8141", phone) #> [,1] [,2] [,3] [,4] #> [1,] "514-791-814" "514" "791" "814"

  • dotall = TRUE 允许 . 匹配所有内容,包括 \n。

除了 regex() 之外,你还可以使用另外三个函数:

  • fixed() 精确匹配指定的字节序列。它会忽略所有特殊的正则表达式语法,并在非常低的层面进行操作。这使你可以避免复杂的转义,并且可能比正则表达式快得多。下面的微基准测试表明,在一个简单示例中它大约快 3 倍:

microbenchmark::microbenchmark( fixed = str_detect(sentences, fixed("the")), regex = str_detect(sentences, "the"), times = 20 ) #> Unit: microseconds #> expr min lq mean median uq max neval cld #> fixed 116 117 136 120 125 389 20 a #> regex 333 337 346 338 342 467 20 b

在处理非英语数据时要小心使用 fixed()。这之所以有问题,是因为同一个字符往往有多种表示方式。例如,定义 "á" 有两种方式:要么作为单个字符,要么作为 "a" 加上一个重音符号:

a1 <- "\u00e1" a2 <- "a\u0301" c(a1, a2) #> [1] "á" "á"