Regular expression to select repeating groups

后端 未结 3 863
终归单人心
终归单人心 2020-12-07 01:33

I have a series of grouped values that follow a specific format and would like to use a single expression to capture them into groups. For example, I have -group1 -gro

相关标签:
3条回答
  • 2020-12-07 02:11

    Try this:

    (-.+?)(\s|$)
    

    Your first capture group will have what you want (-group1, -group2, etc).

    If you want more control over what to allow after the -, change .+? to, for example, [a-zA-Z0-9]+? to only match alphanumeric characters.

    0 讨论(0)
  • 2020-12-07 02:22

    You are in luck because C# is one of the few languages (if not the only one) that supports subexpression captures

    https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)

    The .NET API can be looked at as follows

     Matches
         Groups (most regex engines stop here)
             Captures (unique for .NET)
    

    It's not clear from your question what you want to match exactly but this should get you started. Ask again if you are stuck.

      string input = "-group1 -group2 ";
      string pattern = @"(-\S*\W){2}";
      foreach (Match match in Regex.Matches(input, pattern))
      {
         Console.WriteLine("Match: {0}", match.Value);
         for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
         {
            Group group = match.Groups[groupCtr];
            Console.WriteLine("   Group {0}: {1}", groupCtr, group.Value);
            for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
               Console.WriteLine("      Capture {0}: {1}", captureCtr, 
                                 group.Captures[captureCtr].Value);
         }                      
      } 
    

    This ouputs

    Match: -group1 -group2 
       Group 0: -group1 -group2 
          Capture 0: -group1 -group2 
       Group 1: -group2 
          Capture 0: -group1 
          Capture 1: -group2 
    

    As you can see (Group 1, Capture 0) and (Group 1, Capture 1) offer the individual captures of a group (and not the last as in most languages)

    This address I think of what you describe as "to be able to backreference each of the values separately"

    (You use the term backreference but I don't think you are aiming for a replacement pattern right?)

    0 讨论(0)
  • 2020-12-07 02:37

    With .NET regex (and almost only .NET) you can use:

    (?:(-\S+)\s*)+
    

    Group 1 will contain a list of all matched substrings.

    Or maybe just using Matches is sufficient in your case:

    var re = new Regex(@"-\S+");
    var matches = re.Matches(str);
    
    0 讨论(0)
提交回复
热议问题