使用Regex.Split删除任何非数字和拆分的东西 -

时间:2012-12-08 01:42:28

标签: c# regex string split

我不确定为什么但是由于某种原因,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。关于如何实现我的要求的任何想法?

3 个答案:

答案 0 :(得分:2)

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

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

  1. 在正则表达式中包含,,所以(\d|,)+,这意味着匹配 数字或逗号的行中的多个字符。将有两个匹配项:145,000179,999,您可以使用myStr.Replace(",", "")进一步删除逗号。 (DEMO
  2. 按照标题中的说法操作,并删除所有非数字字符。因此,您可以将Regex.Replace与表达式[^\d-]+一起使用 - 这意味着匹配任何非数字或连字符的内容 - 然后将其替换为""。然后结果将是145000-179999,您可以使用简单的非正则表达式拆分myStr.Split('-')进行拆分,以获得您的两个部分。 (DEMO
  3. 请注意,对于您的第二个示例($180,000-Limit),您需要额外检查以计算第一个示例中Match返回的结果数,以及Split中的{{1}}第二个示例,用于确定范围中是否有两个数字,或者只有一个数字。

答案 1 :(得分:1)

您可以尝试通过基于 - 并仅从中提取数字

来单独处理每个字符串
 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);
 }

答案 2 :(得分:1)

使用RegEx的另一种方法是使用DotNet框架中的内置字符串和char方法。假设输入字符串总是只有一个例子:

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. 拆分字符串
  3. 然后您通过选择性地仅收集集合中每个项目的字母或数字来创建新字符串:x.Where...
  4. 然后使用标准Join方法
  5. 加入字符串
  6. 最后,将集合中的第一个和最后一个项目作为2个字符串。