Regex 用于删除自定义标记的正则表达式模式
我试图找出一个正则表达式,它可以从字符串中删除一组自定义标记。例如,如果我有字符串Regex 用于删除自定义标记的正则表达式模式,regex,r,Regex,R,我试图找出一个正则表达式,它可以从字符串中删除一组自定义标记。例如,如果我有字符串 s = "{\n \"graph\": \"#! graph1 !#\",\n\"element\": \"#! document.getElementById('x_axis1') !#\",\n\"orientation\": \"bottom\" \n}" 我希望输出是 "{\n \"graph\": graph1 ,\n\"element\": document.getElementByI
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)
但它只删除第一组标记。如果有人能给我指出一个可以去除所有自定义标记的正则表达式,我将不胜感激。您可以使用两个
gsub
s:
gsub('!#"', "", gsub('"#!', "", s))
这是你的正则表达式。
[^!].
中的*
正在匹配图1中的所有内容代码>向前(包括换行符)
尝试(将[^!].*
更改为[^!]*
):
试试这个:
gsub("#!(.*?)!#", "\\1", s)
只要您不接受嵌套的#!…“块”#
(例如,#!hello#!world!#再见!#
作为一个实例)并且您不需要检测“不匹配”的块,这应该可以满足您的所有需要
如果确实需要嵌套匹配,则需要构建适当的解析器,而不是使用正则表达式。(这并不难;值得注意的是,您不能使用正则表达式检测任意嵌套的块。)perl=TRUE似乎有帮助,但您的示例不是有效的R语法(引号太多),它是将R对象转换为JSON的结果。我实际上是在尝试将一些参数作为对象而不是字符串传递,这就是标记的原因。我想说的是,如果我将s复制并粘贴到控制台中,它将返回一个错误,因为它不是有效字符串('x_axis1'是问题所在)。如果我将这些单引号替换为双引号,那么正则表达式中的perl=TRUE似乎工作正常。perl=TRUE
似乎工作正常。我正在尝试更多的测试用例。你能把你的评论作为回答吗。可以我应该直接粘贴json输出,而不是使用cat
打印出来。很抱歉。这很好,但我只想删除遵循!\代码>。很好。这似乎也行。我只是在测试更多的用例。我想知道为什么perl=TRUE
也起作用。有什么想法吗?我想这是因为Perl在
中没有包含\n
,而扩展正则表达式(未指定Perl=T时的默认值)没有-如果您有一个“!”选项,这将失败嵌入字符串中,如“foo”:“#!bar!!#”
。如果不能保证‘!’不会在字符串中,我建议@sigpwned的答案(非贪婪匹配)。我接受@sigpwned的答案,尽管我也喜欢你的答案。谢谢。没有嵌套块。您的gsub
正在删除所有内容,包括我要保留的标记之间的文本。对。固定,拉玛斯。很抱歉。
gsub("#!(.*?)!#", "\\1", s)