用.NET正则表达式解析两个混乱的数字



我有一个有趣的数字数据集,需要替换。我如何使用.NET风格的正则表达式(可能带有查找功能)来解析每行中的第一个和第二个数字,使用以下算法

大于15个符号的字符串,如果包含两个数字,且第7个符号后第一次出现[sp{P}],则应将其一分为二。一个正则表达式应该提取第一个子字符串(包含数字、空格和标点符号)。第二个正则表达式提取后半部分。

对于没有合理定义的分隔符的数字,我无能为力。在下面的示例中,前10行是要分割的对象。不能拆分的字符串应该由两个regex语句中的任何一个提取。不用担心n;这些字符串是单独处理的。

42977424427-77927299
62 92764949 44922672
96649274796/46262299
62-96247469,74292792
69227679/69267664
47694274/42929726
42977424427/77927299
97247-2666/7224-4767
89 3644-883436749503
78-99733017785-01627
967224267
6672-2222
97694629646797496
962 44776699
942 76699466
24796427466476967
99 98448999068440722

因此,第一个正则表达式将返回:

42977424427
62 92764949
96649274796
62-96247469
69227679
47694274
42977424427
97247-2666
89 3644
78-99733017785
967224267
6672-2222
97694629646797496
962 44776699
942 76699466
24796427466476967
99 98448999068440722

第二个regex语句将返回

77927299
44922672
46262299
74292792
69267664
42929726
77927299
7224-4767
883436749503
01627

这是我(失败的)提取第二组数字的尝试:

(?=[d p{P}]{15,})[sp{P}][dp{P}]{,8}

也许你可以试试这个正则表达式:

^(.{7}d*)(?:[^dn](.*))?$

点击演示

解释:

  • ^-断言字符串的开头
  • (.{7}d*)-匹配除换行符以外的任何字符的7次出现。后面是一个数字的0+次出现。整个价值包含在第1组中
  • (?:[^dn](.*))?-匹配既不是数字也不是换行符的字符。然后,除了Group2中捕获的换行符外,任何字符都出现0+次。最后的?将使此匹配成为可选
  • $-断言字符串的末尾

另一个正则表达式:

^([d .,?!'":;_-]{7}d*)(?:[^dn]([d .,?!'":;_-]*))?$

我最终得到了一个安静的类似模式

^([dsp{P}]{7}d*)(?:[^dn]([dp{P}]+))?$

它允许您根据需要从捕获组中获取值:

using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"^([dsp{P}]{7}d*)(?:[^dn]([dp{P}]+))?$";
string input = @"42977424427-77927299
62 92764949 44922672
96649274796/46262299
62-96247469,74292792
69227679/69267664
47694274/42929726
42977424427/77927299
97247-2666/7224-4767
89 3644-883436749503
78-99733017785-01627
967224267
6672-2222
97694629646797496
962 44776699
942 76699466
24796427466476967
99 98448999068440722";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("{0}.....{1}", m.Groups[1].Value, m.Groups[2].Value);
}
}
}

只需根据需要使用分组或将最后一根绳子粘在一起即可。

这里有一个模式可以实现你最初的拆分想法:

(?=(?:(?:[dsp{P}]{15,}).))(?<=.{7})[sp{P}]

最新更新