Regex R中的Markdown正则表达式

Regex R中的Markdown正则表达式,regex,r,Regex,R,我在识别第二级标题项时遇到了一点问题 x <- c("## This","## This \n\n ### That \n\n ## This again","## The Other") gsub("## ","---\n\n## ",x ) gsub("##\\s","---\n\n## ",x) 我用gsub尝试了一系列不同的组合和实验。但我似乎无法让它忽略第三级或页眉>第二级页眉项目 x <- c("## This","## This \n\n ### That \n\n

我在识别第二级标题项时遇到了一点问题

x <- c("## This","## This \n\n ### That \n\n ## This again","## The Other")
gsub("## ","---\n\n## ",x )
gsub("##\\s","---\n\n## ",x)
我用gsub尝试了一系列不同的组合和实验。但我似乎无法让它忽略第三级或页眉>第二级页眉项目

x <- c("## This","## This \n\n ### That \n\n ## This again","## The Other")
gsub("## ","---\n\n## ",x )
gsub("##\\s","---\n\n## ",x)

您可以找到以
“##”
开头的字符串,或者不以
“#”
开头的字符串,后面跟着
“##”
,如下所示,使用

gsub("^## |[^#]## ", "---\n\n## ", x)

[1] "---\n\n## This"                                        
[2] "---\n\n## This \n\n ### That \n\n---\n\n## This again"
[3] "---\n\n## The Other" 

括号内的
^
表示“不”。括号外的意思是“以”

开头。您可以使用
找到以
开头的字符串或不以
开头的字符串,后跟
“#”

gsub("^## |[^#]## ", "---\n\n## ", x)

[1] "---\n\n## This"                                        
[2] "---\n\n## This \n\n ### That \n\n---\n\n## This again"
[3] "---\n\n## The Other" 

括号内的
^
表示“不”。括号外的意思是“以”

Try
“(?Try
”(?从问题来看,OP似乎在试图找到一种为Slideify生成幻灯片分隔符的方法(我是这本书的作者)。当文档不包含任何带注释的代码块时,上述所有答案都非常有效。我有一个解决方案,可以忽略带注释的代码块,我将其发布到这里主要是为了完成。
slide\u header
参数可用于定义应使用分隔符的标题

find_code_lines <- function(doc){
  code_blocks = which(grepl("^```", doc))
  code_lines = NULL
  for (i in seq.int(1, length(code_blocks), by = 2)){
    code_lines = c(code_lines, code_blocks[i]:code_blocks[i + 1])
  }
  return(code_lines)
}

add_slide_separator <- function(deckFile, slide_header = "###"){
  doc <- readLines(deckFile)
  code_lines = find_code_lines(doc)
  pattern = paste0('^(', slide_header, ".*)")
  doc[-c(code_lines)] = gsub(pattern, '\n---\n\\1', doc[-c(code_lines)])
  writeLines(doc, con = deckFile)
}

find_code_lines从这个问题来看,OP似乎在试图找到一种为Slideify(我是该书的作者)生成幻灯片分隔符的方法。当文档不包含任何带注释的代码块时,上述所有答案都非常有效。我有一个解决方案,可以忽略带注释的代码块,我将其发布到这里主要是为了完成。
slide\u header
参数可用于定义应使用分隔符的标题

find_code_lines <- function(doc){
  code_blocks = which(grepl("^```", doc))
  code_lines = NULL
  for (i in seq.int(1, length(code_blocks), by = 2)){
    code_lines = c(code_lines, code_blocks[i]:code_blocks[i + 1])
  }
  return(code_lines)
}

add_slide_separator <- function(deckFile, slide_header = "###"){
  doc <- readLines(deckFile)
  code_lines = find_code_lines(doc)
  pattern = paste0('^(', slide_header, ".*)")
  doc[-c(code_lines)] = gsub(pattern, '\n---\n\\1', doc[-c(code_lines)])
  writeLines(doc, con = deckFile)
}

find\u code\u line呸!我试过了,但我认为结尾是\\s。谢谢GSee。实际上,这捕获了元素中的第一次出现,但忽略了所有后续出现。我将更新我的示例。不应该
“[^#]##”
capture(并因此替换)不是
#
的字符?我可以看到输出是正确的,但是为什么?@phalum,你是正确的。这是复制/粘贴错误。我更正了输出(删除了空格).Bah!我试过了,但我认为结尾是\\s。谢谢GSee。实际上,这捕获了元素中的第一次出现,但忽略了所有后续出现。我将更新我的示例。不应该
“[^#]#”
捕获(并因此替换)不是
#
的字符?我可以看到输出是正确的,但是为什么?@phalum,你是正确的。这是一个复制/粘贴错误。我更正了输出(删除了空格)。检查你请求的输出。你确定这就是你想要的输入吗?第一个“This”之后不应该出现“This”吗?更新,感谢阅读我的想法G。检查您请求的输出。您确定这就是您所希望的输入吗?第一个“This”之后不应该出现“This”吗?更新,感谢阅读我的想法G。是的,你是对的,这是为了谷歌文档集成,我们一直在讨论wrt Slidify。对我来说,带注释的代码块不重要的原因是,所有的代码块都需要外部化,以便它首先工作。至少是我编写它的方式。明白了。我把它与一些req混淆了uests我一直在编写没有分隔符的代码组,像pandoc一样自动分解幻灯片。是的,你说得对,这是为了谷歌文档集成,我们一直在讨论wrt Slideify。带注释的代码块对我来说并不重要,原因是所有的代码块都需要外部化,才能在第一时间工作。在至少是我写它的方式。明白了。我把它和一些我一直在写的没有分隔符的甲板的请求搞混了,像pandoc一样自动破坏幻灯片。