使用Regex Split将长字符串拆分为数字和alpha分量

时间:2015-10-07 16:02:06

标签: c# arrays regex string split

我正在制作一个应用程序,它正在读取包含客户信息的excel文件,并将此数据推送到SQL数据库中。问题是原始设计师不是使用列来存储customer namecustomer phonesecondary contact namesecondary contact phone,而是将它们全部放在一个长句中单列。

我的计划是从条目中删除所有空格和非字母数字字符,所以我基本上得到一个长字符串,其中最长的字符串可能是这样的

JeffSmith07621589641SarahSmith09854315741

我打算使用正则表达式拆分名称和数字(并进一步将名称再次拆分为第一个/最后一个)。我一直在尝试像这样的regex.split

String[] splitArray = Regex.Split("JeffSmith07621589641SarahSmith09854315741", 
                                  @"(?<=[a-zA-Z])(?=\d)");

我希望得到4个元素,但我的结果却是这样的

stringArray[0] = JeffSmith
stringArray[1] = 07621589641SarahSmith
stringArray[3] = 09854315741

正如您所看到的,我没有从第一个电话号码,第二个名称中分离出来。

提取数据的最佳方法是什么?

如果它是一个正则表达式,为了实现我正在寻找的东西,需要添加到正则表达式中需要什么?

正则表达式很慢,我在Excel文件中处理了大约4000条记录。

2 个答案:

答案 0 :(得分:3)

雅,为另一种可能性做同样的事情。即,也匹配数字和字母之间存在的边界。目前,您的正则表达式仅匹配字母和数字之间存在的边界。

String[] splitArray = Regex.Split("JeffSmith07621589641SarahSmith09854315741", @"(?<=[a-zA-Z])(?=\d)|(?<=\d)(?=[a-zA-Z])");

DEMO

答案 1 :(得分:2)

或者你可以把它们放到这样的实体中:

var text = "JeffSmith07621589641SarahSmith09854315741";

var pattern = @"(?<Name>[^\d]+)(?<Number>\d+)";

var entities =
         Regex.Matches(text, pattern)
              .OfType<Match>()
              .Select(mt => new
                {
                    Name = mt.Groups["Name"].Value,
                    Phone = mt.Groups["Number"].Value,
                });

结果

enter image description here

如果他们遵循大写后跟小写的模式,则获取名字和姓氏:

var pattern = @"(?<First>[A-Z][a-z]+)(?<Last>[^\d]+)(?<Number>\d+)";

var entities =
         Regex.Matches(text, pattern)
              .OfType<Match>()
               .Select(mt => new
                {
                    NameFirst = mt.Groups["First"].Value,
                    NameLast = mt.Groups["Last"].Value,
                    Phone = mt.Groups["Number"].Value,
                });

enter image description here

更新以首先整理Excel

  

发现一些名称条目完全是小写的

我建议您在创建错误记录列表之前更改Excel中的文本。执行这些步骤

  1. 使用此公式=(CODE(LEFT(B3))>90)+0输入一列,然后按此排序。它允许您按字母顺序从上到下排序,或者只是过滤掉大写字母并进行相应调整。
  2. enter image description here

      

    正则表达式很慢,我在Excel文件中处理了大约4000条记录。

    当用户设计在处理过程中产生大量回溯(读取用户错误)的模式时,正则表达式很慢。

    在大多数模式中简单地避免.*支持.+可以减少正则表达式通过避免大量回溯来处理数据所花费的大部分时间。

    坦率地从Excel中读取将是最大的瓶颈。如果在4000K记录上运行测试,我会推测,正则表达式处理只会在5到15秒之间用Excel添加并写入数据库占用大部分时间。 (IMHO)