【问题标题】:Too greedy Regex problem [closed]太贪婪的正则表达式问题[关闭]
【发布时间】:2010-11-11 13:01:57
【问题描述】:

我需要解析如下示例所示的字符串:

Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9].*) [A-Z]");
var match = TitleRegex.Match("Chapter - 1 The Brown Fox");
Console.WriteLine(match.Groups[1].Value);

我想要的是提取一个数字。问题是输出是1 The Brown 而不是简单的1
我不明白为什么数字 ([0-9]) 模式中也包含字母。

有什么建议吗?

【问题讨论】:

    标签: c# regex regex-greedy


    【解决方案1】:
    Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9]{1,2}) [A-Z]");
    

    您正在捕获.,它通常匹配除新行之外的所有行。我把{1,2} 量词放在那里,这意味着它将匹配0-99。更改它以满足您的要求(或者您可以将其保留为 0 或更多 *)。

    您也可以使用\d 代替[0-9]。速记通常是一件好事:)

    【讨论】:

    • 谢谢!这是一个愚蠢的复制粘贴错误。解决这个问题我搞砸了 %)
    【解决方案2】:

    包含这些字母是因为您在将.* 添加到捕获组时要求提供它们。试试([0-9]+) 或更好的(\d+)

    【讨论】:

      【解决方案3】:

      答案是你似乎误用了量词;

      [0-9].*
      

      该部分模式匹配任何单个数字 (0-9) 一次,然后 匹配任何字符 (.) 0 次或更多次 (*)

      去掉星号前的点。

      [0-9]*
      

      【讨论】:

        【解决方案4】:

        改为:

        "[A-Z].* - ([0-9]?) [A-Z]"
        

        当您使用 [0-9].* 时,它会搜索一个数字加 0 或多个符号,使用 [0-9]+ 会在该特定位置为您提供一个或多个整数。如果您确定不会超过 3 个整数,那么您可以使用 [0-9]{1,3} 或任意数量的 4,5 等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-22
          • 2019-07-30
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多