C#中的正则表达式 - 从另一个值之后的值中删除引号和转义引号

时间:2012-04-10 20:52:02

标签: c# regex

我正在使用HighCharts并从C#生成脚本,并且有一个不幸的事情是他们使用内联函数来格式化和事件。不幸的是,我不能从我知道的任何序列化器输出JSON。换句话说,他们想要这样的东西:

"labels":{"formatter": function() { return Highcharts.numberFormat(this.value, 0); }}

我可以使用我的序列化器,但我只能到这里:

"labels":{"formatter":"function() { return Highcharts.numberFormat(this.value, 0); }"}

这些用于点击事件和格式化程序,我绝对需要它们。

所以我正在考虑正则表达式,但它已经多年了,而且我从来都不是一个正则表达式的巫师。

我可以在最终的序列化字符串上使用什么样的正则表达式替换以用自己的未引用版本替换以function()开头的任何引用值?此外,函数本身可能有“在其中,在这种情况下,引用的字符串可能包含\”,也需要将其替换回“。

我假设我可以在这里使用第一个答案的变体:

Finding quoted strings with escaped quotes in C# using a regular expression

但我似乎无法实现。请帮助我对上帝的爱。

我为此付出了更多的汗水,我想出了

    serialized = Regex.Replace(serialized, @"""function\(\)[^""\\]*(?:\\.[^""\\]*)*""", "function()$1");

然而,我的最终结果总是:

formatter:function()$1

这告诉我,我匹配正确的东西,但我的捕获不正常。现在我觉得我可能是一个C#具体的正则表达式的白痴。

更新:是的,我是个白痴。我没有抓住我真正想要的东西。

   `enter code here` serialized = Regex.Replace(serialized, @"""function\(\)([^""\\]*(?:\\.[^""\\]*)*)""", "function()$1");

得到我的匹配,但在这种情况下:

"formatter":"function() { alert(\"hi!\"); return Highcharts.numberFormat(this.value, 0); }"

它返回:

"formatter":function() { alert(\"hi!\"); return Highcharts.numberFormat(this.value, 0); }

我需要从那里得到那些令人讨厌的反斜杠。现在我觉得我真的被卡住了。

3 个答案:

答案 0 :(得分:1)

匹配的正则表达式

"function\(\) (?<code>.*)"

替换表达式

function() ${code}

答案 1 :(得分:1)

试试这个: http://regexr.com?30jpf

它的作用:

在函数声明之前及之后立即查找双引号。

正则表达式:

(")(?=function()).+(?<=\})(")

替换群组1&amp; 3没有任何东西:

3 capturing groups: 
   group 1: (")
   group 2: ()
   group 3: (")

答案 2 :(得分:1)

    string serialized = JsonSerializer.Serialize(chartDefinition);
    serialized = Regex.Replace(serialized, @"""function\(\)([^""\\]*(?:\\.[^""\\]*)*)""", "function()$1").Replace("\\\"", "\"");