正则表达式模式删除自定义标记

时间:2013-05-27 00:08:03

标签: regex r

我试图弄清楚一个正在从字符串中剥离一组自定义标记的正则表达式。例如,如果我有字符串,

s = "{\n \"graph\": \"#! graph1 !#\",\n\"element\": \"#! 
    document.getElementById('x_axis1') !#\",\n\"orientation\": \"bottom\" \n}"

我希望输出为

"{\n \"graph\":  graph1 ,\n\"element\":  document.getElementById('x_axis1') 
 ,\n\"orientation\": \"bottom\" \n}"

我尝试了以下代码

gsub('\"#!([^!].*)!#\"', "\\1", s)

但它只删除了第一组标记。我真的很感激,如果有人能指出我将剥离所有自定义标记的正则表达式。

3 个答案:

答案 0 :(得分:6)

试试这个:

gsub("#!(.*?)!#", "\\1", s)

只要您不接受#!...!#的嵌套“块”(例如,#! hello #! world !# goodbye !#作为一次出现)并且您不需要检测“不匹配”块,那么应该执行所有操作你需要。

如果确实需要嵌套匹配,则需要构建正确的解析器而不是使用正则表达式。 (这并不难;仅仅值得注意的是,你不能使用正则表达式来检测任意嵌套的块。)

答案 1 :(得分:4)

这是你的正则表达式。 .*中的[^!].*匹配graph.1 !#....以后的所有内容(包括换行符)。

尝试(将[^!].*更改为[^!]*):

gsub('\"#!([^!]*)!#\"', "\\1", s)
#> cat(gsub('\"#!([^!]*)!#\"', "\\1", s))
#{
#   "graph":  graph.1 ,
#   "element":  document.getElementById('x_axis1') ,
#   "orientation": "bottom" 
#}> 

答案 2 :(得分:0)

您可以使用两个gsub s:

gsub('!#"', "", gsub('"#!', "", s))