【问题标题】:hex range pattern match十六进制范围模式匹配
【发布时间】:2018-08-17 22:50:51
【问题描述】:

我正在使用以下 sn-p 将十六进制数字与范围匹配,但它们都不匹配。后来我也转换成十进制,现在很明显正则表达式有问题。一些提示会很好。

        string[] tests = {"F200", "F201", "F2FF","F100","FFFF"};

        const string regexPattern = @"\b[\uF200-\uF2FF]\b";

        Regex rx = new Regex(regexPattern,RegexOptions.Compiled | RegexOptions.IgnoreCase);


        foreach (string test in tests)
        {
            if(rx.IsMatch(test))
                Console.WriteLine("{0} is within the range.",test);
            else
                Console.WriteLine("{0} is not within the range.",test);
        }

        foreach(string test in tests)
        {
            Console.WriteLine("The corresponding decimal value of " + test + " is: " + int.Parse(test, System.Globalization.NumberStyles.HexNumber));
        }

我从regex pattern for a range and above 127 找到了提示,但它并没有解决问题

【问题讨论】:

  • 将数字解析为uint (stackoverflow.com/questions/2801509/…) 然后通过正常的数字范围检查来检查范围不是更有意义吗?这就像用锯子敲钉子一样。
  • 这是一个正则表达式Unicode字符\uF200,这个F200是一串字母和数字。
  • 换一种说法,"\uF200"是1个字符的字符串,F200是4个字符的字符串。甚至不接近同一件事。

标签: c# regex


【解决方案1】:

要以字符串形式获取F200 - F2FF 的十六进制范围,您需要这个正则表达式。

[fF]2[0-9a-fA-F]{2}

【讨论】:

  • 由于给出了选项IgnoreCaseF2[0-9A-F]{2} 对于相同的结果会更简洁。
  • @Andreas - 我没有看到任何不区分大小写更快的情况。 Regex1: [fF]2[0-9a-fA-F]{2} Options: < none > Elapsed Time: 0.27 s, 265.01 ms, 265006 µs Matches per sec: 566,024 Regex2: F2[0-9A-F]{2} Options: < i > Elapsed Time: 0.30 s, 295.55 ms, 295552 µs Matches per sec: 507,524
  • 所以?我从未说过它更快。我说它更简洁(“用几句话清楚地提供大量信息;简短但全面”)。
  • 也许我不能教你关于正则表达式的知识,但似乎我可以教你关于 SO,因为第一个评论不仅适用于你,也适用于阅读你答案的其他任何人。 --- 而且,虽然这让我感到惊讶,但似乎我也可以教你Code of Conduct。 “but out”不是友好的语言。
  • @Andreas - 是的,并没有真正涵盖它。我认为我的答案中的任何 cmets 都是直接给我的,而不是其他人。如果您认为有人会阅读我的答案以获得智慧,那么请不要以您自己的特殊用法形式堆积我的答案,尤其是当您不知道我的答案在说什么时。底线和常识是,大小写无关性会增加 %15-30 的性能开销,因为每个源字符在比较之前都会转换为小写。添加大量的回溯,它会高达 %40。
【解决方案2】:

正如前面提到的 sln,在他的评论中,您将字符串与 Unicode 字符进行比较。

您可以通过将字符串数组更改为: string[] tests = {"\uF200", "\uF201", "\uF2FF", "\uF100", "\uFFFF"};

而且,您的正则表达式类似于:const string regexPattern = @"[\uF200-\uF2FF]";

将生成的代码留给您:

    string[] tests = {"\uF200", "\uF201", "\uF2FF", "\uF100", "\uFFFF"};

    const string regexPattern = @"[\uF200-\uF2FF]";

    Regex rx = new Regex(regexPattern,RegexOptions.Compiled | RegexOptions.IgnoreCase);


    foreach (string test in tests)
    {
        if(rx.IsMatch(test))
            Console.WriteLine("{0} is within the range.",test);
        else
            Console.WriteLine("{0} is not within the range.",test);
    }

    foreach(string test in tests)
    {
        Console.WriteLine("The corresponding decimal value of " + test + " is: " + int.Parse(test, System.Globalization.NumberStyles.HexNumber));
    }

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 2011-11-09
    • 2023-04-07
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多