【问题标题】:C# regex not matching stringC# 正则表达式不匹配字符串
【发布时间】:2011-12-21 04:02:27
【问题描述】:

我有一个格式如下的字符串:$20,$40,$AA,$FF。基本上,十六进制数字,它们可以是许多字节。我想检查一个字符串是否是上述格式,所以我尝试了这样的事情:

        string a = "$20,$30,$40";

        Regex reg = new Regex(@"$[0-9a-fA-F],");
        if (a.StartsWith(string.Format("{0}{1}", reg, reg)))
            MessageBox.Show("A");

它似乎不起作用,我还缺少什么吗?

【问题讨论】:

    标签: c# regex string hex match


    【解决方案1】:

    有3件事需要改变:

    需要转义 $ 符号,因为它代表行尾。

    \$
    

    需要调整您的正则表达式模式以匹配整个字符串而不是部分。

    ^(\$[0-9a-fA-F]{2},+)+\$[0-9a-fA-F]{2}$
    

    需要更改您的代码才能使用 Regex.IsMatch。

    string a = "$20,$30,$40"; 
    if (Regex.IsMatch(a,@"^(\$[0-9a-fA-F]{2},+)+\$[0-9a-fA-F]{2}$",RegexOptions.IgnoreCase))
            MessageBox.Show("A");
    

    PS:

    如果输入字符串有空格(如制表符)或中间有空格,则需要修改此正则表达式。在这种情况下,您必须在正确的位置使用“\s”。例如,如果逗号周围有空格,例如

    string a = "$20 ,$30, $40";
    

    那么你需要用这种方式调整你的 RegEx:

    ^(\$[0-9a-fA-F]{2}\s*,+\s*)+\$[0-9a-fA-F]{2}\s*$
    

    参考资料:

    1. C# 正则表达式测试器
    2. 关于 Regex.IsMatch(而不是使用 Match)
    3. C# Regular Expression Cheat Sheet

    下面的旧答案(忽略):

    试试这个:

    "\$[0-9a-fA-F]{2}?[,]{0,1}"
    

    【讨论】:

    • 奇怪的是,它并没有解决问题..我认为问题是缺少 $ 之前的 \,但事实并非如此..
    • 这是三重问题,你必须用转义来修复 $,必须修复正则表达式以确保它与完整的字符串匹配,并且你必须更改代码以使用正确的正则表达式方法。检查编辑的答案。
    • 您的正则表达式将接受缺少的逗号,例如$20,$30$40 根据您在其他地方发布的测试站点匹配
    • @Rune,没错!修复了代码。谢谢你。 StackOverflow中有很多类似的例子都忽略了这一点。
    • 正则表达式中 s 后面的 * 是什么意思?
    【解决方案2】:

    $ 是正则表达式中的特殊字符,表示字符串的结尾。该正则表达式根本不匹配任何内容,因为您在字符串结束后指定了内容。像

    一样转义 $ 字符
    "\$[0-9a-fA-F]{2},"
    

    无论如何,这不适用于您的字符串,因为它不以“,”结尾。你可以试试:

    "^(\$[0-9a-fA-F]{2},?)+$"
    

    您甚至可以使用不区分大小写的正则表达式匹配来简化正则表达式:

    Regex reg = new Regex(@"^(\$[0-9A-F]{2},?)+$", RegexOptions.IgnoreCase);
    

    编辑:更正为完全匹配 2 个十六进制数字。

    编辑:也许你应该写你的正则表达式检查:

    if (Regex.IsMatch(a,@"^(\$[0-9A-F]{2},?)+$",RegexOptions.IgnoreCase)) 
    {
        // Do whatever
    }
    

    【讨论】:

    • 这也不起作用,[] 中的范围仅匹配 1 个字符。在此处测试您的正则表达式:derekslager.com/blog/posts/2007/09/…
    • 是的,谢谢,已更正。我使用 Perl 测试正则表达式,但我没有时间测试这个 :) 事实上我根本没有 C# 的想法 ;)
    • 奇怪.. 它似乎没有解决问题。我的字符串格式(if 语句)也正确吗?
    • 正如我所说,我对 C# 完全不了解,但谷歌给出了这个:Match match = Regex.Match(input, @"content/([A-Za-z0-9\-]+)\.aspx$", RegexOptions.IgnoreCase); // Here we check the Match instance. if (match.Success) {} 添加以正确的正则表达式回答...
    • 不,Match 在指定的输入字符串中搜索第一次出现的正则表达式。因此 match.success 仅指示第一个匹配项,即 $20。如果您将输入字符串更改为“$20,$40BlahBlah”,您仍然会获得成功。您应该改用 Regex.IsMatch。
    【解决方案3】:

    您可能还想为您的集合添加一个重复修饰符,使其变为;

    "\$[0-9a-fA-F]+,"
    

    【讨论】:

      【解决方案4】:

      我认为您缺少量词:

      "\$[0-9a-fA-F]+,"
      

      对于末尾逗号的问题,我会简单地在末尾附加一个以使正则表达式尽可能简单。但这正是我会做的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2013-12-25
        相关资源
        最近更新 更多