【问题标题】:Eliminate the letters or marks out only leave numbers and apostrophe消除字母或标记只留下数字和撇号
【发布时间】:2010-10-14 20:49:16
【问题描述】:

案例如下;

  • 82&?
  • 82,9
  • abse82,9>dpkg

正则表达式之后

  • 82
  • 82,9
  • 82,9

请帮助我在 c# 上使用 Regex 完成此操作

【问题讨论】:

    标签: c# .net asp.net regex string


    【解决方案1】:

    如果您使用的是 .NET3.5+,则可以使用 LINQ。没有正则表达式(更快)的解决方案如下:

    var strings = new List<string>() { "82&?", "82,9", "abse82,9>dpkg" };
    var result = strings.Select(s =>
        String.Join("",
            s.Where(c => char.IsNumber(c) || c == ',')
            .ToArray()) /* .ToArray() is not needed on .NET 4 */
        ).ToList();
    

    它只选择数字或逗号的字符。但是给定字符串8,1aa1,它会返回8,11

    这另一种方法有点慢,但它会从8,1aa18,1 而不会取8,aa,a

    var strings = new List<string>() { "82&?887..2", "82,9", "abse82,9>dpkg" };
    var result = strings.Select(s =>
        String.Join("",
            s.SkipWhile(c => !char.IsNumber(c))
            .TakeWhile(c => (char.IsNumber(c) || c == ','))
            .ToArray()
        )
    ).Where(s => char.IsNumber(s.LastOrDefault())).ToList();
    

    使用我得到的答案中提供的方法运行 100,000 次迭代的测试(使用秒表):

    Fn: BrunoLM (Method 1)
    Ticks: 524999
    
    Fn: BrunoLM (Method 2)
    Ticks: 729460
    
    Fn: Ahmad
    Ticks: 1323366
    
    Fn: Josh
    Ticks: 3783158
    

    1000~ 长度字符串的相同测试:

    var strings = new List<string>() { "82&?887..2".PadRight(1000, '2'), "82,9".PadRight(1000, '1'), "abse82,9>dpkg".PadRight(1000, 'f') };
    

    结果:

    Fn: Ahmad
    Ticks: 11911332
    
    Fn: BrunoLM (Method 2)
    Ticks: 28149495
    
    Fn: Josh
    Ticks: 213681541
    

    进一步阅读:

    正则表达式和文本大小n

    【讨论】:

    • 当您搜索较大的字符串时,Regex 会更快,但根据我的经验,如果您不使用超过 50 个字符的字符串,甚至不要考虑 Regex。
    • 正则表达式变慢并不意味着它不是一个好的答案。尝试将“foo,bar”(带逗号)作为您的解决方案或 JoshVarga 解决方案的输入。目前这两种解决方案都会返回一个逗号。 My solution 不认为它是匹配的。添加逻辑来处理这种情况,正则表达式很快就占据了恕我直言。当然 OP 没有说他有这样的情况,所以这可能不是问题。
    • @Ahmad:感谢您指出这一点,我想我已经修复了Method 2。我没有说你的回答不好。我是说正则表达式在某些情况下很慢。如果他的文本有很多字符,那么您的解决方案会更快,如上所示。
    • @Kirk:感谢分享。我对 1000~ 长度的字符串进行了测试,Ahmad 的正则表达式获胜。 :)
    • @Bruno:我明白,我只是想说,速度本身并不总是一个明确的标准,它最终取决于数据(正如您在基准测试中所展示的那样)。顺便说一句,我只是在猜测 OP 真正想要什么。关于“foo,bar”示例,我不知道它是否延伸到“8,a”。在这种情况下,也许 OP 想要“8”,或者只有在逗号后面出现一个数字时他们才想要它(正如你所拥有的那样)。 OP需要澄清。我并不是想让你编​​写 OP 在我的评论中没有要求的东西!
    【解决方案2】:

    使用此模式:\d+(,\d+)?

    • \d:匹配 0-9 的数字
    • +:匹配模式至少一次,所以\d+至少匹配一位数字
    • (,\d+)?:这表示一个组(使用括号)匹配逗号后跟数字并且可选匹配它(由于组末尾的?

    代码sn-p:

    string[] inputs = { "82&?", "82,9", "abse82,9>dpkg", "foobar" };
    foreach (var input in inputs)
    {
        Match m = Regex.Match(input, @"\d+(,\d+)?");
        if (m.Success)
        {
            Console.WriteLine(m.Value);
        }
        else
        {
            Console.WriteLine("No match!");
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您只是在寻找这些字符并试图撕掉其他任何内容,您可以执行以下操作

          var strings = new List<string>()
                          {
                              "82&?",
                              "82,9",
                              "abse82,9>dpkg"
                          };
          var reg = new Regex("[^0-9,]*", RegexOptions.None);
          var output = new List<string>();
          foreach(var str in strings)
          {
              output.Add(reg.Replace(str, ""));
          }
      

      【讨论】:

        猜你喜欢
        • 2019-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 2016-08-24
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多