捕获组
可以使用索引表示法从 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")