Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
C# 只匹配一个组的正则表达式_C#_Regex_Delimited Text - Fatal编程技术网

C# 只匹配一个组的正则表达式

C# 只匹配一个组的正则表达式,c#,regex,delimited-text,C#,Regex,Delimited Text,我有一个非常古老的(奇怪的分隔符)字符串,它表示一个表,我想将所有文本放在两个“标记”之间(它们是一个令人讨厌的东西……它们在这里非常出色): |||评论\u FOLLOW\u UP=\\myserver\Reporter\testu\20140611.rtf||| |||COMMENTS\u APPOINTMENT\u LIST=\\myserver\Reporter\testu\COMMENTS\u APPOINTMENT\u LIST\u 20140611.rtf||| 开始每月细分~~

我有一个非常古老的(奇怪的分隔符)字符串,它表示一个表,我想将所有文本放在两个“标记”之间(它们是一个令人讨厌的东西……它们在这里非常出色):


|||评论\u FOLLOW\u UP=\\myserver\Reporter\testu\20140611.rtf|||
|||COMMENTS\u APPOINTMENT\u LIST=\\myserver\Reporter\testu\COMMENTS\u APPOINTMENT\u LIST\u 20140611.rtf|||
开始每月细分~~~
###行开始###
###行端###
###行开始###
###行端###
###行开始###
###行端###
###行开始###
###行端###
###行开始###
###行端###
月底分类~~~
开始活动~~~
###行开始###
您可以使用:

或者,您可以获得一个匹配,然后获得下一个匹配,等等:

var m = Regex.Match(input_string, regex);
while (m.Success)
{
    // do something with this match
    // then get the next match
    m = m.NextMatch();
}
您可以使用:

或者,您可以获得一个匹配,然后获得下一个匹配,等等:

var m = Regex.Match(input_string, regex);
while (m.Success)
{
    // do something with this match
    // then get the next match
    m = m.NextMatch();
}

首先,我建议您将正则表达式更改为:

(?s)~~~ START ([^~]*).*?END \1 ~~~
  • 在开场白和
    START
    之后,
    ([^~]*)
    捕获块的标题。这确保了我们可以确保
    END
    稍后匹配
  • 懒惰的
    *?
    匹配到
  • 标题(后面由
    \
    引用)和结束波浪号
  • 示例代码

    这是一个完整的程序,你可以用它来测试。我还没试过。您需要将字符串粘贴到其中

    using System;
    using System.Text.RegularExpressions;
    using System.Collections.Specialized;
    class Program {
    static void Main()    {
    string s1 = @"PASTE YOUR STRING HERE";
    var myRegex = new Regex(@"(?s)~~~ START ([^~]*).*?END \1 ~~~");
    MatchCollection AllMatches = myRegex.Matches(s1);
    Console.WriteLine("\n" + "*** Matches ***");
    if (AllMatches.Count > 0)    {
        foreach (Match SomeMatch in AllMatches)    {
            Console.WriteLine("Title: " + SomeMatch.Groups[1].Value);
            Console.WriteLine("Overall Match: " + SomeMatch.Value);
        }
    }
    
    Console.WriteLine("\nPress Any Key to Exit.");
    Console.ReadKey();
    
    } // END Main
    } // END Program
    

    首先,我建议您将正则表达式更改为:

    (?s)~~~ START ([^~]*).*?END \1 ~~~
    
  • 在开场白和
    START
    之后,
    ([^~]*)
    捕获块的标题。这确保了我们可以确保
    END
    稍后匹配
  • 懒惰的
    *?
    匹配到
  • 标题(后面由
    \
    引用)和结束波浪号
  • 示例代码

    这是一个完整的程序,你可以用它来测试。我还没试过。您需要将字符串粘贴到其中

    using System;
    using System.Text.RegularExpressions;
    using System.Collections.Specialized;
    class Program {
    static void Main()    {
    string s1 = @"PASTE YOUR STRING HERE";
    var myRegex = new Regex(@"(?s)~~~ START ([^~]*).*?END \1 ~~~");
    MatchCollection AllMatches = myRegex.Matches(s1);
    Console.WriteLine("\n" + "*** Matches ***");
    if (AllMatches.Count > 0)    {
        foreach (Match SomeMatch in AllMatches)    {
            Console.WriteLine("Title: " + SomeMatch.Groups[1].Value);
            Console.WriteLine("Overall Match: " + SomeMatch.Value);
        }
    }
    
    Console.WriteLine("\nPress Any Key to Exit.");
    Console.ReadKey();
    
    } // END Main
    } // END Program
    

    您需要在循环中多次调用正则表达式匹配器,直到没有匹配为止。考虑修改表达式以避免回溯——在这种情况下,这是非常可能的,因为<代码> .+/COD>是贪婪的(与“不情愿的”相反)。 下面是一个小演示,演示了如何执行此操作:

    var regex = new Regex("~~~ START ([^~]+)~~~([^~]*)~~~ END ([^~]+)~~~", RegexOptions.Multiline);
    var m = regex.Match(Data);
    while (m.Success) {
        Console.WriteLine("------ Start: {0} --------", m.Groups[1]);
        Console.WriteLine(m.Groups[2]);
        Console.WriteLine("------ End: {0} --------", m.Groups[3]);
        m = m.NextMatch();
    }
    


    注意上面的更改-我用
    [^~]
    替换了
    ,以匹配第一个Swiggly,并且我还捕获了开始和结束标记的内容以进行打印。

    您需要在循环中多次调用正则表达式匹配器,直到没有匹配为止。考虑修改表达式以避免回溯——在这种情况下,这是非常可能的,因为<代码> .+/COD>是贪婪的(与“不情愿的”相反)。 下面是一个小演示,演示了如何执行此操作:

    var regex = new Regex("~~~ START ([^~]+)~~~([^~]*)~~~ END ([^~]+)~~~", RegexOptions.Multiline);
    var m = regex.Match(Data);
    while (m.Success) {
        Console.WriteLine("------ Start: {0} --------", m.Groups[1]);
        Console.WriteLine(m.Groups[2]);
        Console.WriteLine("------ End: {0} --------", m.Groups[3]);
        m = m.NextMatch();
    }
    


    注意上面的更改-我将
    替换为
    [^~]
    以匹配第一个squiggly,并且我还捕获了开始和结束标记的内容以进行打印。

    我认为您必须使用全局标志。包括实际代码;我想可能有用。我想你必须使用全局标志。包括实际代码;我想可能有用。真不敢相信我从未使用过
    匹配项。每次复数都会让我得到+1,并被接受,因为你提供了另一个感谢Jim。我不敢相信我从未使用过
    匹配项。每次复数都会得到我,+1并被接受,因为你提供了一个备用的感谢Jim。这是一个很好的解决方案+1对,
    *?
    *
    的非贪婪版本。它使正则表达式执行器的工作更加困难,但有必要防止
    *
    耗尽所有
    结束
    文本。@leemo您确实需要更改正则表达式以使任何解决方案工作,这就是为什么此答案提供了一个正确的正则表达式。您的原始正则表达式
    ~~~~开始、+~~(.*)~~~~结束、+~~~
    不起作用。这是一个很好的解决方案+1正确,
    *?
    *
    的非贪婪版本。它使正则表达式执行器的工作更加困难,但有必要防止
    *
    耗尽所有
    结束
    文本。@leemo您确实需要更改正则表达式以使任何解决方案工作,这就是为什么此答案提供了一个正确的正则表达式。您原来的正则表达式
    ~~~~开始、+~~(.*)~~~~~结束、+~~~~
    不起作用。匹配第一个波浪形是一种比我贪婪的方法更好的方法。。。更新,谢谢。我希望我能接受所有的答案。非常感谢大家的时间。匹配第一块瓷砖比我贪婪的方式更好。。。更新,谢谢。我希望我能接受所有的答案。非常感谢大家的时间。