Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于删除自定义标记的正则表达式模式_Regex_R - Fatal编程技术网

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)