【问题标题】:Extract string between curly braces using str_extract_all使用 str_extract_all 提取花括号之间的字符串
【发布时间】:2021-05-25 02:43:31
【问题描述】:

我有以下代码:

myFunction.R

myFunction({
  lorem <- "ipsum"
  ...
  print("dolor sit amet")
})

myFunction({
  consectetur <- "adipiscing elit"
  ...
  sed <- paste("do", "eiusmod")
})

...

在另一个 R 脚本中,我想提取所有 myFunction 调用。现在我想出的最好的是:

library(stringr)
library(readtext)

script <- readtext('myFunction.R')[['text']]
matches <- str_extract_all(script, 'myFunction(.|\\n)*\\}\\)')[[1]]

但不幸的是,matches 包含第一个 myFunction 调用,直到文件末尾。如何改进正则表达式以仅匹配每个 myFunction 调用?

【问题讨论】:

  • str_extract_all(script, "(?ms)^myFunction\\(\\{.*?^\\}\\)$")
  • 你展示了两个myFunction
  • 有很多myFunction调用,@akrun
  • 第一种方法确实有效,@WiktorStribiżew。 readtextreadtext 包中的一个函数;它将文件作为单个字符串读取——它缺少[['text']] 访问权限,但我现在将在示例中解决此问题。

标签: r regex newline stringr curly-braces


【解决方案1】:

你可以使用

str_extract_all(script, "(?ms)^myFunction\\(\\{.*?^\\}\\)$")

详情

  • (?ms) - 打开多行(m,使^$ 分别匹配行的开头和结尾)和dotall(s,使. 也匹配它不匹配的换行符默认)模式
  • ^ - 行首
  • myFunction\\(\\{ - 文字 myFunction({ 文本
  • .*? - 任何零个或多个字符,尽可能少
  • ^ - 行首
  • \}\) - 文字 }) 文本
  • $ - 一行结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2020-01-26
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多