2

我试图找出一个正则表达式,它会从字符串中删除一组自定义标记。例如,如果我有字符串,

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)

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

4

3 回答 3

6

尝试这个:

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

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

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

于 2013-05-27T00:22:42.580 回答
4

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

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

gsub('\"#!([^!]*)!#\"', "\\1", s)
#> cat(gsub('\"#!([^!]*)!#\"', "\\1", s))
#{
#   "graph":  graph.1 ,
#   "element":  document.getElementById('x_axis1') ,
#   "orientation": "bottom" 
#}> 
于 2013-05-27T00:21:36.983 回答
0

您可以使用两个gsubs:

gsub('!#"', "", gsub('"#!', "", s))
于 2013-05-27T00:16:16.077 回答