1

我在识别只有二级标题项目时遇到了一些问题。

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

基本上,我需要替换这样的二级标题是这样的:

"---\n\n## This"      
"---\n\n## This \n\n ### That \n\n ---\n\n## This again"     
"---\n\n## The Other"

我用 gsub 尝试了一堆不同的组合和实验。但我似乎无法让它忽略第三个或标题> 2 级标题项。

gsub("## ","---\n\n## ",x )
gsub("##\\s","---\n\n## ",x)
4

3 回答 3

5

Try "(?<!#)## "
It 捕获所有"## "没有以 . 开头的事件#

> gsub("(?<!#)## ", "---\n\n## ", x, perl=TRUE)
[1] "---\n\n## This"                                        
[2] "---\n\n## This \n\n ### That \n\n ---\n\n## This again"
[3] "---\n\n## The Other" 
于 2013-06-24T18:36:55.023 回答
4

您可以找到以 a 开头"##"以 a 开头的字符串,"#"然后"## "像这样使用|

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" 

括号里面的^意思是“不是”。在括号之外,它的意思是,“开始于”

于 2013-06-24T17:57:24.873 回答
1

从这个问题来看,OP 似乎正试图找到一种方法来为 Slidify(我是其作者)生成幻灯片分隔符。当文档不包含任何带有注释的代码块时,上述所有答案都很好用。我有一个解决方案,它忽略带有注释的代码块,并在这里发布它主要是为了完成。该slide_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)
}

我看到我的代码将无法区分#####修改 gsub 行,gsub("^## |[^#]## ", "---\n\n## ", x)使其与接受的答案相同。

于 2013-06-24T21:36:31.663 回答