【问题标题】:extract distinct list of number from a list of strings in C#从 C# 中的字符串列表中提取不同的数字列表
【发布时间】:2015-01-29 20:21:10
【问题描述】:

我有一个包含以下值的字符串列表:

"/manufacturers/244/rz-xvxcv/images/swed"
"/manufacturers/23/rz-gf/images/sltn"
"/manufacturers/34/rz-dffdf/images/five"
"/manufacturers/23/rz-gfgf/images/lead"
"/manufacturers/322/rz-dfg/images/carr"
"/manufacturers/3789/rz-fgdfgfg/images/zing"

我需要提取属于模式/manufacturers/[int]/rz- 的数字值的不同列表

所以在上面的例子中,我的新列表将包含:244,23,34,322,3789

这可以使用 RegEx 和 Linq 完成吗?

【问题讨论】:

  • 现在看,您需要一个正则表达式来执行此操作。如果它们都相同,只需使用@"\d+"。如果他们不是,并且需要获得资格,您将不得不使用@"^/manufacturers/(\d+)/rz-"。这是仅有的两个选择。你能做的最糟糕的事情就是在/ 上分裂,这是没用的。
  • @sln 如果 OP 需要验证他们是否以“/manufacturers/”开头,那么他们可以在Where 中使用StartsWith。仍然不需要正则表达式。我看不出在/ 上分裂是最糟糕的事情。
  • @juharr - 在这种情况下拆分 resilts 被用于位置假设数组元素是一个数字。仍然不能验证序列/manufacturers/\d+/rz-。你知道也许它可以在拆分后得到验证,但是为什么不直接使用正则表达式呢?
  • @sln 再次,OP 可以添加检查以确保路径的第二部分是数字。 paths.Where(p=>p.StartsWith("/manufacturers/")).Select(p=>p.Split('/')[2]).Where(d=>d.All(char.IsNumber)).Select(d=>int.Parse(d))。现在在这一点上,使用正则表达式的代码会更少,但性能不会更高,所以它只取决于哪个更重要。
  • @juharr - 是的,我猜。但我愿意打赌@"^/manufacturers/(\d+)/rz-" 更高效且更易于维护。 .

标签: c# regex linq


【解决方案1】:

我只使用Split 而不是正则表达式

var numbers = paths.Select(p=>int.Parse(p.Split('/')[2])).ToList();

【讨论】:

    【解决方案2】:

    不是超级抽象或可重复使用,但非常中肯。

    var numbers = paths.Select(p => int.Parse(p.Substring(15, p.IndexOf('/', 15) - 15)));
    

    【讨论】:

      【解决方案3】:

      如果你想使用 RegEx 和 LINQ:

      var regex = new Regex(@"(\d+)");
      var numbers = paths.Select(i => regex.Match(i).Value).ToList();
      

      【讨论】:

        【解决方案4】:

        你可以使用这种模式
        (\d+)(?!.*\1) 虽然没有按顺序提取 Demo

        (               # Capturing Group (1)
          \d            # <digit 0-9>
          +             # (one or more)(greedy)
        )               # End of Capturing Group (1)
        (?!             # Negative Look-Ahead
          .             # Any character except line break
          *             # (zero or more)(greedy)
          \1            # Back reference to group (1)
        )               # End of Negative Look-Ahead
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 2017-03-11
          • 2014-07-12
          • 2018-12-13
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          相关资源
          最近更新 更多