【问题标题】:Using Regex.Split to remove anything non numeric and splitting on -使用 Regex.Split 删除任何非数字并拆分 -
【发布时间】:2012-12-08 10:33:35
【问题描述】:

我不知道为什么,但出于某种原因,Regex Split 方法超出了我的想象。我正在尝试通过教程查找我需要的内容,但似乎找不到任何内容。

我只是在阅读一个 excel 文档,并想格式化一个字符串,例如 $145,000-$179,999 给我两个字符串。 145000179999。同时,我想将'$180,000-Limit 之类的字符串修剪为简单的180000

var loanLimits = Regex.Matches(Result.Rows[row + 2 + i][column].ToString(), @"\d+");

上面的代码似乎将'$145,000-$179,999 分成4 部分:145000179999。关于如何实现我所要求的任何想法?

【问题讨论】:

    标签: c# regex string split


    【解决方案1】:

    正则表达式完全匹配一个字符一个字符(在正则表达式中不知道“数字”或“单词”的概念——你必须在你的表达式中自己定义)。您正在使用的表达式\d+ 使用字符类\d,表示任何数字0-9(而+ 表示匹配一个或多个)。因此,在表达式$145,000 中,请注意您要查找的部分不仅仅是由数字组成;它还包括逗号。所以正则表达式会找到每一个与你的正则表达式匹配的连续字符组,即四组数字。

    有几种方法可以解决这个问题。

    1. 在正则表达式中包含,,即(\d|,)+,这意味着匹配一行中数字或逗号的尽可能多的字符。将有两个匹配项:145,000179,999,您可以从中进一步删除带有myStr.Replace(",", "") 的逗号。 (DEMO)
    2. 按照标题中的说明操作,删除所有非数字字符。因此,您可以将Regex.Replace 与表达式[^\d-]+ 一起使用——这意味着匹配任何不是数字或连字符的内容——然后将它们替换为""。然后结果将是145000-179999,您可以使用简单的非正则表达式拆分myStr.Split('-') 来拆分它,以获得您的两个部分。 (DEMO)

    请注意,对于您的第二个示例 ($180,000-Limit),您需要额外检查以计算从第一个示例中的 Match 和第二个示例中的 Split 返回的结果数以确定是否存在是该范围内的两个数字,或者只有一个数字。

    【讨论】:

    • 你先生,真棒。非常感谢。你放在那里的小“演示”非常有用。感谢您的知识!
    • @JustinPeterson:见注释。您需要一些特殊的逻辑来处理只有一个数字的第二种情况。
    • 当然。好吧,我将这些数字添加到列表中,因此我正在检查是否有第二个值。在该检查中,如果计数 ,我只需添加一个默认值
    【解决方案2】:

    您可以尝试通过根据 - 吐出每个字符串来分别处理每个字符串,并从中仅提取数字

     ArrayList mystrings = new ArrayList();
     List<string> myList = Result.Rows[row + 2 + i][column].ToString().Split('-').ToList();
    
     foreach(var item in myList)
     {
    
         string result = Regex.Replace(item, @"[^\d]", "");
         mystrings.Add(result);
     }
    

    【讨论】:

      【解决方案3】:

      使用 RegEx 的替代方法是使用 DotNet 框架中的内置字符串和字符方法。假设输入字符串总是有一个连字符:

      string input = "$145,000-$179,999";
      
      var split = input.Split( '-' )
              .Select( x => string.Join( "", x.Where( char.IsLetterOrDigit ) ) )
              .ToList();
      
      string first = split.First(); //145000
      string second = split.Last(); //179999
      
      1. 首先使用标准Split 方法拆分字符串
      2. 然后您通过有选择地仅从集合中的每个项目中获取字母或数字来创建一个新字符串:x.Where...
      3. 然后使用标准的Join 方法加入字符串
      4. 最后,将集合中的第一项和最后一项作为 2 个字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 2020-09-19
        • 1970-01-01
        • 2021-03-02
        • 2014-02-11
        • 2011-06-22
        • 2022-12-16
        相关资源
        最近更新 更多