Извлечь строку между фигурными скобками, используя str_extract_all

У меня есть следующий код:

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?


person Lucas Almeida Carotta    schedule 22.02.2021    source источник
comment
Вы показали два myFunction.   -  person akrun    schedule 22.02.2021
comment
Много myFunction звонков, @akrun   -  person Lucas Almeida Carotta    schedule 22.02.2021
comment
Первый подход сработал, @WiktorStribiżew. readtext — функция из пакета readtext; он читает файл как одну строку — ему не хватает доступа [['text']], но я собираюсь исправить это в примере прямо сейчас.   -  person Lucas Almeida Carotta    schedule 22.02.2021


Ответы (1)


Вы можете использовать

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

Подробности:

  • (?ms) — включить многострочный (m, заставляет ^ и $ совпадать с началом и концом строк соответственно) и точечный (s, заставляет . также совпадать с символами разрыва строки, которые не совпадают по умолчанию) режимы
  • ^ - начало строки
  • myFunction\\(\\{ - буквальный myFunction({ текст
  • .*? - любое количество символов, равное нулю или больше, как можно меньше
  • ^ - начало строки
  • \}\) - буквальный }) текст
  • $ - конец строки.
person Wiktor Stribiżew    schedule 22.02.2021