2013-06-24 75 views
1

我在識別二級標題項時遇到了一些問題。R中的Markdown正則表達式

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的。但我似乎無法讓它忽略第三個或標題>第二級標題項目。

gsub("## ","---\n\n## ",x) 
gsub("##\\s","---\n\n## ",x) 
+0

檢查您的請求輸出。你確定這就是你想要給你輸入的東西嗎?不應該在第一個「This」之後出現「This Again」? – GSee

+0

更新,感謝您閱讀我的意見G. –

回答

4

你可以找到與"##"開始或"#"開始,之後是"## "這樣的字符串,使用|

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" 

^的括號內的手段「不。」支架之外,這意味着,

+0

Bah!我嘗試過,但最終我認爲是\\ s。謝謝GSee。 –

+0

實際上,這捕獲了元素中的第一個事件,但忽略了所有後續事件。我要更新我的例子。 –

+0

不應''[]#] ##「'捕獲(並因此替換)不是'#'的字符?我可以看到輸出是正確的,但爲什麼? – Pharaoh

5

「開頭」嘗試"(?<!#)## "
它捕獲不受#之前的"## "所有出現。

> 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" 
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)作爲公認的答案將會使工作區分開來。

+0

是的,你說的對,我們一直在討論Slidify的google docs集成。原因代碼塊與評論對我來說並不重要的是,所有的塊都需要外部化,以便它首先工作。至少我寫過的方式。 –

+0

明白了。我把它和一些我沒有分隔符寫入套牌的請求混淆起來,並自動打破像pandoc這樣的幻燈片。 – Ramnath