捕获组

可以使用索引表示法从 RegexMatch 对象访问捕获组捕获的子字符串。

例如,以下正则表达式解析以 (555)-555-5555 格式编写的北美电话号码:

julia> phone = r"\((\d{3})\)-(\d{3})-(\d{4})"

并假设我们希望从文本中提取电话号码:

julia> text = """
       My phone number is (555)-505-1000.
       Her phone number is (555)-999-9999.
       """
"My phone number is (555)-505-1000.\nHer phone number is (555)-999-9999.\n"

使用 matchall 函数,我们可以得到一个匹配自己的子字符串数组:

julia> matchall(phone, text)
2-element Array{SubString{String},1}:
 "(555)-505-1000"
 "(555)-999-9999"

但是假设我们想要访问区号(前三位数,括在括号中)。然后我们可以使用 eachmatch 迭代器:

julia> for m in eachmatch(phone, text)
           println("Matched $(m.match) with area code $(m[1])")
       end
Matched (555)-505-1000 with area code 555
Matched (555)-999-9999 with area code 555

请注意,我们使用 m[1],因为区号是我们正则表达式中的第一个捕获组。我们可以使用函数将电话号码的所有三个组成部分作为元组:

julia> splitmatch(m) = m[1], m[2], m[3]
splitmatch (generic function with 1 method)

然后我们可以将这样的函数应用于特定的 RegexMatch

julia> splitmatch(match(phone, text))
("555","505","1000")

或者我们可以在每个匹配中发现它:

julia> map(splitmatch, eachmatch(phone, text))
2-element Array{Tuple{SubString{String},SubString{String},SubString{String}},1}:
 ("555","505","1000")
 ("555","999","9999")