gpt4 book ai didi

c# - 基准测试 .Net 正则表达式选项 - 或者 RightToLeft 做什么?

转载 作者:太空宇宙 更新时间:2023-11-03 13:34:15 24 4
gpt4 key购买 nike

我创建了一个演示应用程序来测试某些正则表达式的性能。我的第三个测试使用选项 RightToLeft .

它似乎大大加快了这个过程!为什么?它有什么作用?

这是我的测试应用:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
private const string IsRequestForDirectoryWithoutTrailingSlashRegex = @"^(?#Path:)(.*/)?(?#LastPart:)(?<!\.asmx|\.aspx/)([^./?#]+?)(?#QueryString:)(\?.*?)(?#Anchor:)?(#.*)?$";

private static string[] Tests = new string[] {
"http://localhost/manager/page.aspx",
"http://localhost/manager/",
"http://localhost/manager",
"http://localhost/manager/?param=value",
"http://localhost/manager/dir?param=value"
};

static void Main(string[] args)
{
Test1();
Test2();
Test3();
Test4();

Console.WriteLine();
Console.ReadLine();
}

public static void Test1()
{
Regex regex = new Regex(IsRequestForDirectoryWithoutTrailingSlashRegex);
DoWork("1", regex);
}

public static void Test2()
{
Regex regex = new Regex(IsRequestForDirectoryWithoutTrailingSlashRegex, RegexOptions.Compiled);
DoWork("2", regex);
}

public static void Test3()
{
Regex regex = new Regex(IsRequestForDirectoryWithoutTrailingSlashRegex, RegexOptions.Compiled | RegexOptions.RightToLeft);
DoWork("3", regex);
}

public static void Test4()
{
Regex regex = new Regex(IsRequestForDirectoryWithoutTrailingSlashRegex, RegexOptions.Compiled | RegexOptions.RightToLeft | RegexOptions.IgnoreCase);
DoWork("4", regex);
}
static void DoWork(string name, Regex regex)
{
Stopwatch sp = new Stopwatch();
sp.Start();

for (int i = 0; i < 100000; i++)
{
foreach (string s in Tests)
{
regex.IsMatch(s);
}
}

foreach (string s in Tests)
{
Console.WriteLine(":" + s + ":" + regex.IsMatch(s).ToString());
}

sp.Stop();

Console.WriteLine("Test " + name + ": " + sp.ElapsedTicks);
}
}
}

最佳答案

RegexOptions.RightToLeft当您尝试匹配您希望在输入字符串末尾找到的模式时,这可能很有用,因为正如其文档所述:搜索从 right to left 从左到右开始,从输入字符串中的最后一个字符,尽管正则表达式本身仍然从左到右应用。

您的正则表达式似乎正在寻找目录路径的尾部斜杠,因此这种情况似乎符合描述。

尽管您的表达式正在寻找尾部斜线,但这两个 anchor (^$) 的存在使我的推理错误,因为正则表达式无论从哪里开始都只能以一种可能的方式匹配。

我将继续寻找这背后的真正原因,但现在我将保持原样。

另一方面,在表达式开头的 (?#Path:) 部分之后的表达式的 .*/ 部分消耗整个输入字符串,然后每次都递归地返回以找到最后一个 /,因此当开始进一步搜索时,可能不会有很多回溯。

关于c# - 基准测试 .Net 正则表达式选项 - 或者 RightToLeft 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com