iT邦幫忙

1

正規表示法 Match Group Capture 如何區分

  • 分享至 

  • xImage

小弟正在研究正規表示法中
目前遇到一個問題
即是 Match Group Capture 如何區分
目前已知以以下程式為例

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {   string input = "Yes. This dog is very friendly.";
        string pattern = @"((\w+)[\s.])+";

        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);
            }
        }
    }
}

其結果會出現

Match: Yes.
   Group 0: Yes.
      Capture 0: Yes.
   Group 1: Yes.
      Capture 0: Yes.
   Group 2: Yes
      Capture 0: Yes
Match: This dog is very friendly.
   Group 0: This dog is very friendly.
      Capture 0: This dog is very friendly.
   Group 1: friendly.
      Capture 0: This
      Capture 1: dog
      Capture 2: is
      Capture 3: very
      Capture 4: friendly.
   Group 2: friendly
      Capture 0: This
      Capture 1: dog
      Capture 2: is
      Capture 3: very
      Capture 4: friendly

其中我在網路上爬文已知 Match 基本等於Group0
Group可以用 () 來區分要在哪個Group
不過對於Capture還不知道要怎麼區分

其中在Match: This dog is very friendly. 的Group1之下同時有5個Capture
想詢問Capture的機制

看更多先前的討論...收起先前的討論...
(\w+)[\s.]
可以匹配單字
例如: This 、dog

一個句子可能出現多個單字
例如: This dog is very friendly.

(\w+)
但最裡面的括號只有一個,怎麼匹配多個單字呢?

這時候就可以用 Capture

Capture 可以取得所有括號匹配過的項目,而 Group 只能取得最後一項
lazywayne iT邦新手 5 級 ‧ 2020-03-12 14:02:50 檢舉
那以Group1來說
Group 1: friendly.
他為甚麼會有 5個 capture? 他這個Group應該不包含到那5個Capture
lazywayne iT邦新手 5 級 ‧ 2020-03-12 14:08:19 檢舉
我想確認下
Match
{ Group0
{ Capture0
Capture1
Capture2
}
Group1
Group2
}
一個Match包含多個Group
一個Group包含多個Capture
這個理解正確嗎?
Group1 是不是也包含 Group2 ?
lazywayne iT邦新手 5 級 ‧ 2020-03-12 14:28:34 檢舉
這樣觀察下來Group內好像是可以包到其他Group的,但感覺有點亂糟糟的
Group 1 最後是集合 [\s.] 代表 \s 或 . 都是含括在裡面的
所以 Group1 的 Capture 0, 1, 2, 3 是 (\w+)[\s], 4 是 (\w+)[.]
Group2 的 Capture 0, 1, 2, 3, 4 是 (\w+)
listennn08 大說的沒錯

Group1 也有五個是因為括號的位置

(\w+) 等於一個單字
((\w+)[\s.]) 也等於一個單字
((\w+)[\s.])+ 才等於一整個句子

如果再包一個 Group
那最外面的 Group1 就會是句子
(((\w+)[\s.])+)
一個Match包含多個Group
一個Group包含多個Capture
這個理解正確嗎?

Ans: 正確
--------------------------------------

這樣觀察下來Group內好像是可以包到其他Group的,但感覺有點亂糟糟的

Ans: 沒錯,Group 可以包 Group,不過他們對於 Capture 的邏輯是分開的
這需要細細品嘗 ╰( ̄▽ ̄)╭
lazywayne iT邦新手 5 級 ‧ 2020-03-13 09:18:50 檢舉
可以描述一下...Capture的邏輯嗎?
只差這個沒搞懂了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
listennn08
iT邦高手 5 級 ‧ 2020-03-13 09:56:52
最佳解答
# ((\w+)[\s.])+

Group 1: friendly.
                   # 正則只會匹配到最後一個 (\w+)[\s.]
   Capture 0: This 
                   # 這個也符合 (\w+)[\s.]
   Capture 1: dog 
                   # 這個也符合 (\w+)[\s.]
   Capture 2: is 
                   # 這個也符合 (\w+)[\s.]
   Capture 3: very 
                   # 這個也符合 (\w+)[\s.]
   Capture 4: friendly.
                   # 這個也符合 (\w+)[\s.]
   # 所以 Group1 的符合項目 會是 [a-zA-Z0-9]+ 加 空格 或 .
   # Capture 會捕捉所有符合項目
   # 運作邏輯
   # This dog is very friendly.
   # Group 會一直找到最後一項匹配項目
   # "This "     匹配 (\w+)[\s.] Group 繼續往下找
   #             Capture 紀錄匹配項目 Capture ++
   # "dog "      匹配 (\w+)[\s.] Group 繼續往下找
   #             Capture 紀錄匹配項目 Capture ++
   # "is "       匹配 (\w+)[\s.] Group 繼續往下找
   #             Capture 紀錄匹配項目 Capture ++
   # "very "     匹配 (\w+)[\s.] Group 繼續往下找
   #             Capture 紀錄匹配項目 Capture ++
   # "friendly." 匹配 (\w+)[\s.] Group 繼續往下找 但這是最後的字母了
   #             所以 Group 1 會出現 friendly. Capture 紀錄匹配項目 Capture ++
               
# Group2 同理
Group 2: friendly
               # (\w+)
   Capture 0: This
               # (\w+)
   Capture 1: dog
               # (\w+)
   Capture 2: is
               # (\w+)
   Capture 3: very
               # (\w+)
   Capture 4: friendly
               # (\w+)
   # Capture 一樣會符合所有匹配項目 但這裡的 Capture 只會有單字
lazywayne iT邦新手 5 級 ‧ 2020-03-13 10:17:06 檢舉

秒懂

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-03-12 11:27:56

參考看看官方文件
大概可以知其然不知其所以然
/images/emoticon/emoticon19.gif

lazywayne iT邦新手 5 級 ‧ 2020-03-12 11:49:00 檢舉

有看了...但是看了沒懂/images/emoticon/emoticon06.gif

我要發表回答

立即登入回答