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 に答える