0

我正在使用 HighCharts 并从 C# 生成脚本,不幸的是,他们使用内联函数进行格式化程序和事件。不幸的是,我无法从我知道的任何序列化程序中输出这样的 JSON。换句话说,他们想要这样的东西:

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

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

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

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

所以我在想正则表达式,但已经很多年了,而且我从来都不是一个正则表达式向导。

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

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

使用正则表达式在 C# 中使用转义引号查找带引号的字符串

但我似乎无法做到这一点。为了上帝的爱,请帮助我。

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

    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); }

我需要把那些讨厌的反斜杠去掉。现在我想我真的被困住了。

4

3 回答 3

1

匹配的正则表达式

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

替换表达式

function() ${code}
于 2012-04-10T21:17:29.210 回答
1

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

它能做什么 :

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

正则表达式:

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

将第 1 组和第 3 组替换为空:

3 capturing groups: 
   group 1: (")
   group 2: ()
   group 3: (")
于 2012-04-10T21:19:50.297 回答
1
    string serialized = JsonSerializer.Serialize(chartDefinition);
    serialized = Regex.Replace(serialized, @"""function\(\)([^""\\]*(?:\\.[^""\\]*)*)""", "function()$1").Replace("\\\"", "\"");
于 2012-04-17T00:07:50.977 回答