2016-04-07 43 views
0

İçinde virgül olan bir sürü knitr belgelerinde (.Rnw) bir LaTeX \ index komutunun örneklerini bulmam gerekiyor. Bunlar çoklu hatlar üzerinde, örn.Çok satırlı düzenli ifadeler R

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

bir şeyleri bulmak için benim R koduyla makul mutluyum:

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"))}) 
} 

Ancak, ben sağ düzenli ifade almak gibi olamaz. Daha alır bazı ama her şey

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

alır

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

denedim ama çok ben istemiyorum. Örneğin,

Tüm yardımlar takdir edilir.

+0

Örneğinizde eşleşecek veya eşleşecek daha büyük bir takımınız varsa bu yardımcı olur. Ne olursa olsun, çok satırlı bir bayrak var '(? M) 'perl benzeri bir ifade ile ayarlayabilirsiniz. Pattern = "(? M)^\\\\ index \\ {. * [,] [^}] * \\}" 'gibi bir şey? Gregexpr'de 'perl = TRUE' ayarlamalısınız. – alistaire

cevap

1

Çoğu zaman, bir satırda birden çok normal ifadeyi kullanmak istediğinizden tam olarak alan bir normal ifadeden daha kolaydır. Senin durumunda:

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, ",")] 

ilk regex tüm \ endeksi {} şeyler, across lines bulur. İkincisi sadece virgül olanları tutar.

Bu, birinciyi alır, ikinci olur. Bu şekilde istemediğiniz şeyleri sıralamak için daha fazla katman ekleyebilirsiniz.

+0

Teşekkürler @Deleet. İkinci patterleri kullanarak pattern = "\\\\ index \\ {[A-Za-z \\ s] [^}] * \\}" 'hile yaptı –