我正在使用 HighCharts 并从 C# 生成脚本,不幸的是,他们使用内联函数进行格式化程序和事件。不幸的是,我无法从我知道的任何序列化程序中输出这样的 JSON。换句话说,他们想要这样的东西:
"labels":{"formatter": function() { return Highcharts.numberFormat(this.value, 0); }}
我可以使用我的序列化程序,我只能到这里:
"labels":{"formatter":"function() { return Highcharts.numberFormat(this.value, 0); }"}
这些用于点击事件以及格式化程序,我绝对需要它们。
所以我在想正则表达式,但已经很多年了,而且我从来都不是一个正则表达式向导。
我可以在最终的序列化字符串上使用哪种正则表达式替换,以将任何以 function() 开头的引用值替换为自身的未引用版本?此外,函数本身可能包含“”,在这种情况下,引用的字符串可能包含“\”,也需要将其替换回“。
我假设我可以在这里使用第一个答案的变体:
但我似乎无法做到这一点。为了上帝的爱,请帮助我。
我为此付出了更多的汗水,我想出了
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); }
我需要把那些讨厌的反斜杠去掉。现在我想我真的被困住了。