使用 JScript.NET 在变量中匹配和存储字符串的一部分



我正在摆弄一些使用 JScript.NET 的Fiddler脚本。我有一个格式的字符串:

{"params":{"key1":"somevalue","key2":"someothervalue","key3":"whatevervalue", ...

我想匹配并显示"key2":"someothervalue" someothervalue可以是任何值,但键是静态的。

使用好的旧sedbash我可以将我正在寻找的部分替换为:

$ a='{"params":{"key1":"somevalue","key2":"someothervalue","key3":"whatevervalue", ...'
$ echo $a | sed -r 's/"key2":"[^"]+"/replaced/g'
{"params":{"key1":"somevalue",replaced,"key3":"whatevervalue", ...

现在。我想使用 JScript.NET 将该部分提取到变量中,而不是替换它。怎么能做到这一点呢?

最优雅的方法是使用 JSON 解析器。 我个人的偏好是使用 htmlfile COM 对象导入 IE 的 JSON 解析器。

import System;
var str:String = '{"params":{"key1":"foo","key2":"bar","key3":"baz"}}',
    htmlfile = new ActiveXObject('htmlfile');
// force htmlfile COM object into IE9 compatibility
htmlfile.IHTMLDocument2_write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
// clone JSON object and methods into familiar syntax
var JSON = htmlfile.parentWindow.JSON,
// deserialize your JSON-formatted string
    obj = JSON.parse(str);
// access JSON values as members of a hierarchical object
Console.WriteLine("params.key2 = " + obj.params.key2);
// beautify the JSON
Console.WriteLine(JSON.stringify(obj, null, 't'));

编译、链接和运行会产生以下控制台输出:

params.key2 = bar
{
        "params": {
                "key1": "foo",
                "key2": "bar",
                "key3": "baz"
        }
}

或者,也至少有几个 .NET 命名空间,它们提供将对象序列化为 JSON 字符串以及将 JSON 字符串反序列化为对象的方法。 不过,不能说我是粉丝。 ECMAScript 对JSON.parse()JSON.stringify()的表示法肯定比Microsoft上发生的任何胡子疯狂要容易得多,也少得多。


虽然我当然不建议将JSON(或任何其他分层标记,如果可以帮助的话(作为复杂的文本进行抓取,但 JScript.NET 将处理许多熟悉的Javascript方法和对象,包括正则表达式对象和字符串上的正则表达式替换。

SED 语法:

echo $a | sed -r 's/("key2"):"[^"]*"/1:"replaced"/g'

JScript.NET 语法:

print(a.replace(/("key2"):"[^"]*"/, '$1:"replaced"'));

JScript.NET,就像 JScript 和 JavaScript 一样,也允许调用 lambda 函数进行替换。

print(
    a.replace(
        /"(key2)":"([^"]*)"/,
        // $0 = full match; $1 = (key2); $2 = ([^"]*)
        function($0, $1, $2):String {
            var replace:String = $2.toUpperCase();
            return '"$1":"' + replace + '"';
        }
    )
);

。或者使用RegExp对象的exec()方法提取key2的值:

var extracted:String = /"key2":"([^"]*)"/.exec(a)[1];
print(extracted);

但是,请注意这一点,因为如果没有匹配项,检索exec()结果的元素[1]将导致索引超出范围异常。 可能想要if (/"key2":/.test(a))或添加try...catch。 或者更好的是,只需按照我之前所说的操作,将 JSON 反序列化为对象即可。

最新更新