1

我有一个用 JScript.Net 为 FiddlerScript 编写的代码片段,并试图在 C# 中重写它以用作 Fiddler 扩展。我不熟悉 C# 语法,所以需要帮助。

这是 JScript.NET 中现有的代码片段,我正在尝试将其转换为 C#:

var sHostname = oSession.hostname;

switch(sHostname) {
    case /example1.com/i.test(sHostname) && sHostname:
    case /example2.com/i.test(sHostname) && sHostname:
    case /example3.com/i.test(sHostname) && sHostname:
        MessageBox.Show("Matched: " + sHostname);
    default:
        FiddlerApplication.Log.LogString("No match for hostname.");
}

这是我在 C# 中尝试过的东西,但这是非常原始的:

var sHostname = oSession.hostname;
string[] patterns = { @"[a-z]", @"[0-9]", @"example[0-9]", @"[a-z0-9.]", @"\w+" }; // a collection of about 20K+ pattern entries, yes 20K+, and stored in separate class
IList<string> patternList = new ReadOnlyCollection<string>(patterns);

var status = false;
var pattern = "";
foreach (string p in patternList)
{
    if (Regex.IsMatch(sHostname, p, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
    {
        pattern = p;
        status = true;
        break;
    }
}

if (status)
{
    System.Diagnostics.Debug.WriteLine("Matched: " + pattern);
    // Other code
} else
{
    System.Diagnostics.Debug.WriteLine("No match found");
    // Other code
}

作为 C# 的新手,我遇到了很多东西:

  • 正则表达式编译版本比每次都创建新对象要好。我不确定指定开关RegexOptions::Compiled | RegexOptions::IgnoreCase是否与创建列表一次并使用过度迭代相同。对此的任何提示都会有所帮助。
  • 使用 LINQ 而不是样板代码。
  • 还有更多 C# 世界中的好东西

我感兴趣的是匹配与否(布尔真/假值),如 Any() 并且不执行任何匹配、拆分等。同样,此代码需要在 Fiddler 中每秒执行数百次,所以它需要足够高效以匹配指定输入字符串的超过 20K+ 模式列表。我知道这听起来有点疯狂,所以需要专家的帮助。

仅供参考,我使用的是 Visual Studio 2013,所以不确定我是否可以使用 C# 7 语法。如果可以在 C# 7 或更高版本的 VS 中完成更好的事情,我会非常感兴趣。

先感谢您!

4

0 回答 0