R中的多行正则表达式

时间:2016-04-07 04:12:39

标签: regex r latex multiline

我需要在一大堆带有逗号的knitr文档(.Rnw)中找到LaTeX \ index命令的实例。这些可能发生在多行上,例如

\index{prior distribution,choosing beta prior for
$\pi$,vague prior knowledge}

我对我的R代码感到相当满意:

line = paste(readLines(input), collapse = "\n")
r = gregexpr(pattern, line)

if(length(r) > 0){
    lapply(regmatches(line, r), function(e){cat(paste(substr(e, 0, 50), "\n"))})
}

但是,我似乎无法正确表达正则。我试过了

pattern = "(\\s)\\\\index\\{.*[,][^}]*\\}"

获得一些但不是一切

pattern = "\\\\index\\{[A-Za-z \\s][^}]*\\}"

获得更多,但我不想要的很多。例如,它找到了

\index{posterior variance!beta distribution}

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

通常,连续使用多个正则表达式比使用正确的正则表达式更容易。在你的情况下:

library(stringr)
t = "\\index{prior distribution,choosing beta prior for
  \\$\\pi\\$,vague prior knowledge} bleh
\\index{posterior variance!beta distribution}"
cat(t)

tier_1 = str_match_all(t, "(?s)\\index\\{.*?\\}")[[1]]
tier_2 = tier_1[str_detect(tier_1, ",")]

第一个正则表达式找到所有\ index {}的东西,across lines。第二个只保留逗号。

这是第一个,而不是第二个。你可以添加更多层来排序你不想要的东西。