Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用.NET正则表达式解析两个混乱的数字_.net_Regex_String_Split_Regex Lookarounds - Fatal编程技术网

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

用.NET正则表达式解析两个混乱的数字,.net,regex,string,split,regex-lookarounds,.net,Regex,String,Split,Regex Lookarounds,我有一个有趣的数据集,需要替换。如何使用.NET风格的正则表达式(可能带有lookaround)使用以下算法解析每行的第一个和第二个数字 大于15个符号的字符串包含两个数字,在第7个符号后第一次出现的[\s\p{p}]将分隔为两个。一个正则表达式应该提取第一个子字符串(包含数字、空格、标点)。第二个正则表达式提取下半部分 对于没有合理定义分隔符的数字,我无能为力。在下面的示例中,前10行是要拆分的对象。不能拆分的字符串应该由两个正则表达式语句中的任何一个来提取。无需担心\n;这些字符串是单独处理

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

大于15个符号的字符串包含两个数字,在第7个符号后第一次出现的
[\s\p{p}]
将分隔为两个。一个正则表达式应该提取第一个子字符串(包含数字、空格、标点)。第二个正则表达式提取下半部分

对于没有合理定义分隔符的数字,我无能为力。在下面的示例中,前10行是要拆分的对象。不能拆分的字符串应该由两个正则表达式语句中的任何一个来提取。无需担心
\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,})[\s\p{P}][\d\p{P}]{,8}

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

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

说明:

  • ^
    -断言字符串的开头
  • (.{7}\d*)
    -匹配除换行符以外的任何字符的7次出现。然后是数字的0+次出现。整个值在组1中捕获
  • (?:[^\d\n](.*)?
    -匹配一个既不是数字也不是换行符的字符。然后,除了在Group2中捕获的换行符之外,任何字符的出现次数都超过0次<代码>?最后是使此匹配成为可选的
  • $
    -断言字符串的结尾
另一个正则表达式:


我最终得到了一个安静的相似的结果

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

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^([\d\s\p{P}]{7}\d*)(?:[^\d\n]([\d\p{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);
        }
    }
}
只需根据需要使用组或将最后的字符串粘在一起

下面是一个模式,它支持您最初的拆分想法:


如果您决定降低问题的评分,请解释如何改进问题。无声的降级会适得其反。我仍然有一个问题,仍然需要社区的帮助。我不知道,也许有些人觉得你试图利用他们,或者第二次发现你的尝试非常糟糕,不算是真正的尝试。第三,有些人可能会发现你的问题陈述不清楚,没有经过深思熟虑,你的例子也没有定论。不过,别介意,我没有投反对票。@wp78de:谢谢。我也有同样的想法,因此,在尝试了几个小时后,我才发布了我的最佳尝试。我觉得这个问题已经形成,但欢迎提出建议。这里有一个清晰的解释,我期望有一个清晰的答案。请记住,这是一个来自真实(混乱)世界的问题;我花时间制作了一个“公共”样本集。@OlegMelnikov你是说你需要15个以上的符号。但仍然需要匹配字符串,如
967224267
6672-2222
9624776699
9427669666
,这些字符串的符号数少于15个。请clarify@Gurman:仅当字符串足够长(大约15个符号)并且在第7个符号后有分隔符时,我才想将其解析为两个。否则,请保持原样。这有意义吗?太好了!我想这可能行得通。在完整的集合上尝试它。这可能有效,但它使用.NET风格的正则表达式捕获整个字符串。不过,它可以在PHP风格下工作。有没有办法为.NET调整它?我认为.NET类似于php中的javascript,它也匹配完整的字符串。您只需要从组1和组2获取结果。请参阅我提供的演示链接右侧的group1和group2的值。尝试时,.NET的
RegexReplace()
仍然捕获整个字符串,而不仅仅是第一组或第二组。有什么建议吗?太好了!谢谢其余的我都知道了。这正是我需要的:)谢谢。我想我可以使用
RegexExtract()
进行分组,感谢您的说明和示例!它工作得很好!
using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^([\d\s\p{P}]{7}\d*)(?:[^\d\n]([\d\p{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);
        }
    }
}