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

2023-12-23

我正在摆弄一些Fiddler 的脚本 http://fiddlerbook.com/Fiddler/dev/ScriptSamples.asp,它使用 JScript.NET。我有一个格式的字符串:

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

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

使用好旧sed and bash我可以用以下内容替换我正在寻找的部分:

$ 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 解析器。我个人的偏好是使用以下命令导入 IE 的 JSON 解析器htmlfileCOM 对象。

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 命名空间 https://stackoverflow.com/q/18242429/1683264它提供了将对象序列化为 JSON 字符串以及将 JSON 字符串反序列化为对象的方法。但不能说我是粉丝。 ECMAScript 表示法JSON.parse() and JSON.stringify()肯定比任何颈胡子疯狂更容易,也更不那么陌生微软正在发生的事情 https://msdn.microsoft.com/en-us/library/bb412179%28v=vs.110%29.aspx.


虽然我当然不建议将 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 + '"';
        }
    )
);

...或者提取值key2使用RegExp对象的exec() method:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JScript.NET 匹配字符串的一部分并将其存储在变量中 的相关文章

随机推荐