正则表达式在未被方括号括起时替换子串出现

时间:2011-05-09 12:46:49

标签: regex r

假设我有以下字符串向量:

x <- c("this!", "is!", "not my name[!]!", "Understrand[!] Mate!", 
"Because!I[!] said so!")

我需要一种替换惊叹号的方法“!”使用“!\ n”但仅当感叹号未被方括号括起时。所以输出看起来像这样:

"this!\n"
"is!\n"
"not my name[!]!\n"
"Understrand[!] Mate!\n"
"Because!\nI[!] said so!\n"

我一直在玩,只是想不出来。

非常感谢您的任何帮助。

Tony B。

1 个答案:

答案 0 :(得分:6)

使用带有负面后瞻(?<!pattern)和负前瞻(?!pattern)断言的perl样式正则表达式:

R> gsub("(?<!\\[)\\!(?!\\])", "!\n", x, perl=TRUE)
[1] "this!\n"                   "is!\n"                    
[3] "not my name[!]!\n"         "Understrand[!] Mate!\n"   
[5] "Because!\nI[!] said so!\n"

编辑: @Mareks测试用例需要布尔“或”(“|”):

R> gsub("(?<!\\[)\\!|\\!(?!\\])", "!\n", c("aa[!bb", "aa!]bb"), perl=TRUE)
[1] "aa[!\nbb" "aa!\n]bb"