正则表达式 - 匹配与群组

时间:2018-04-25 14:04:49

标签: c# regex

我很抱歉,如果这件事重复,但我看不出这些问题已经回答了我的问题。

你能帮忙解释一下:

  1. 仅针对name举行的匹配或捕获在哪里?模式[A-Za-z0-9_\-\.]+的初始部分没有在括号中显示,所以我理解它不是一个组,然后name如何被捕获并保存为Match 0的组件? / p>

  2. 如果我将字符串t2替换为name@domain.com alt@yahoo.net并将模式替换为^([A-Za-z0-9_\-\.\ ]+@(([A-Za-z0-9\-])+\.)+([A-Za-z\-])+)+$

    • 我希望有两场比赛:每个完整的电子邮件地址一个。输出只显示1个匹配,两者之间用空格分隔,为什么?
    • 如何读取模式以获得2个匹配,或者该模式的字符串是否需要不同?
    • 我没有看到群组输出中的一致性,因为它没有显示另一个群组持有捕获0=com并捕获1=net,类似于群组2持有domain.和{{1抓住,为什么?
    • 第3组捕获似乎包含了第2组捕获0和1的捕获,是层次结构如何工作,是否有捕获组的捕获?
  3. 代码

    yahoo.

    上述代码的输出:

    static void Main(string[] args)
        {
            string t2 = "name@domain.com";
            string p2 = @"^[A-Za-z0-9_\-\.\ ]+@(([A-Za-z0-9\-])+\.)+([A-Za-z\-])+$";
    
            MatchCollection matches = Regex.Matches(t2, p2);
            GroupCollection gc;
            int groupIndex = 0;
            int matchIndex = 0;
            int captureIndex = 0;
    
            foreach (Match nextMatch in matches)
            {
                gc = nextMatch.Groups;
                Console.WriteLine("Match {0} holds: {1}", matchIndex, nextMatch.Value);
                matchIndex++;
                foreach (Group g in gc)
                {
                    Console.WriteLine("Group {0} holding: {1}", groupIndex, g.ToString());
                    groupIndex++;
    
                    foreach (Capture capture in g.Captures)
                    {
                        Console.WriteLine("\tCapture {0} holds {1}", captureIndex, capture.ToString());
                        captureIndex++;
                    }
                    captureIndex = 0;
                }
                groupIndex = 0;
            }
            matchIndex = 0;
        }
    

    输出字符串Match 0 holds: name@domain.com Group 0 holding: name@domain.com Capture 0 holds name@domain.com Group 1 holding: domain. Capture 0 holds domain. Group 2 holding: n Capture 0 holds d Capture 1 holds o Capture 2 holds m Capture 3 holds a Capture 4 holds i Capture 5 holds n Group 3 holding: m Capture 0 holds c Capture 1 holds o Capture 2 holds m Press any key to continue . . . 和字符串t2 = "name@domain.com alt@yahoo.net";;

    p2 = @"^([A-Za-z0-9_\-\.\ ]+@(([A-Za-z0-9\-])+\.)+([A-Za-z\-])+)+$"

1 个答案:

答案 0 :(得分:0)

Match涵盖了整个正则表达式的匹配。正则表达式可以应用于给定的字符串。

GroupMatchCapture的一部分(如果您指定了多个类似于(someRegex)的组)+所有Capture s Group。尝试将([A-Za-z\-])+更改为([A-Za-z\-]+)并查看差异!

示例:

\w*(123)\w*

上的

"asdsa123asdf"

  1. 匹配 - > asdsa123asdf
  2. 群组 - > 123 (==最后一次捕获)
  3. 捕获 - > 123
  4. \w*([123])+\w*

    上的

    "asdsa123asdf"

    1. 匹配 - > asdsa123asdf
    2. 群组 - > 3 (==最后一次捕获)
    3. 捕获 - > 1,2,3
    4. 有多个网站可供测试并显示正则表达式的详细信息,例如https://regexr.comhttps://regex101.com