【问题标题】:Matching and storing part of a string in a variable using JScript.NET使用 JScript.NET 在变量中匹配和存储部分字符串
【发布时间】:2014-12-04 13:35:37
【问题描述】:

我正在摆弄一些script for Fiddler,它使用JScript.NET。我有一个格式的字符串:

{"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 将该部分提取到一个变量中。怎么可能?

【问题讨论】:

  • 我对 JScript.NET 了解不多,但是用正则表达式解析代码似乎是个坏主意。您不能将脚本作为对象加载吗?我是一个 PHP 人,相当于 json_decode($json) - JScript.NET 没有这样的选项吗?
  • 这当然是另一种选择。不过,我想学习如何使用 JScript.NET 显示正则表达式匹配,因为我将使用相同的方法来显示其他有趣的东西。

标签: regex jscript.net


【解决方案1】:

最优雅的方式是使用 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"
        }
}

另外,至少还有一个couple of .NET namespaces 提供将对象序列化为 JSON 字符串以及将 JSON 字符串反序列化为对象的方法。不过,不能说我是粉丝。 JSON.parse()JSON.stringify() 的 ECMAScript 符号肯定比任何胡须疯狂 going on at 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);

不过,请注意这一点,因为如果没有匹配项,则检索 [1] 的结果中的元素 exec() 将导致 index-out-of-range 异常。可能想要if (/"key2":/.test(a)) 或添加try...catch。或者更好的是,按照我之前所说的将 JSON 反序列化为一个对象。

【讨论】:

  • 如果我在关闭前使用htmlfile.parentWindow.JSON 则不适合我,它会返回undefined
  • @MamdouhFreelance 您是否执行了http-equiv="x-ua-compatible" 的操作并将兼容性设置为"IE=9"?默认情况下,JScript 和 JScript.NET 加载一个较旧的解释器,它不包括 JSON 对象和方法。您必须使用meta 标记来强制JScript.NET 加载Chakra 引擎。此外,如果您通过 Windows Scripting Host 使用 JScript 而不是 JScript 的 .NET 风格,则必须使用 comObj.write 而不是上面演示的 comObj.IHTMLDocument2_write 方法。如果这不能解决您的问题,请创建一个包含完整详细信息的新问题帖子。
猜你喜欢
  • 1970-01-01
  • 2014-07-13
  • 2021-11-27
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2012-06-15
相关资源
最近更新 更多