我有一个用 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 中完成更好的事情,我会非常感兴趣。
先感谢您!