📜  Julia 中的模式匹配

📅  最后修改于: 2021-11-25 04:41:02             🧑  作者: Mango

模式匹配是检查给定数据中是否存在特定字符/令牌/数据序列的过程。正则编程语言使用正则表达式 (regex) 进行模式匹配。

在 Julia 中,可以使用以下预定义函数将给定字符串与给定模式匹配:

  • 比赛()
  • 匹配()
  • 火柴()
  • 每个匹配()

所有这些函数都以针、大海捞针的顺序接受参数。在正则表达式的上下文中,正则表达式是针,文本是大海捞针。

使用 match()函数

match()是 Julia 中的一个内置函数,用于在指定的字符串搜索给定正则表达式的第一个匹配项。如果正则表达式匹配,则 match 返回的值是 RegexMatch 对象。这些对象记录表达式如何匹配,包括模式匹配的子字符串和任何捕获的子字符串(如果有)。

您可以从 RegexMatch 对象中提取以下信息:

  • 整个子串匹配: m.match
  • 捕获的子字符串作为字符串数组: m.captures
  • 整个比赛开始的偏移量: m.offset
  • 捕获的子串的偏移量作为向量: m.offsets
Syntax:
match(r::Regex, s::AbstractString, idx::Integer)

Parameters:
r::Regex: Specified regular expression.
s::AbstractString: Specified string.
idx::Integer: It specifies the point from which the searching get started.

Returns: It returns a RegexMatch object containing the match or nothing if the match failed.
Julia
println(match(r"s.t", "the cat sat on the mat"))
println(match(r"^\w+", "This is a test"))


Julia
println(ismatch(r"(cat|dog)s?", "My pigs"))
println(ismatch(r"(cat|dog)s?", "My cats"))


Julia
println(matchall(r"[a-z]", "is a letter"))


Julia
for m in eachmatch(r"(cat|dog)s?", "My cats and my dog")
    println("Matched $(m.match) at index $(m.offset)")
end


使用 ismatch()函数

ismatch()函数返回一个布尔值,指示是否在字符串中找到匹配项。

Syntax:
match(r::Regex, s::AbstractString)

Parameters:
r::Regex: Specified regular expression.
s::AbstractString: Specified string.

Returns: It returns a boolean value and returns true if match is found, otherwise false.

朱莉娅

println(ismatch(r"(cat|dog)s?", "My pigs"))
println(ismatch(r"(cat|dog)s?", "My cats"))

使用 matchall()函数

matchall()函数可用于在字符串查找正则表达式的所有匹配项。

Syntax:
matchall(r::Regex, s::AbstractString, overlap::Bool=false)

Parameters:
r::Regex: Specified regular expression.
s::AbstractString: Specified string.
overlap: Boolean Value. If overlap is true, the matching sequences are allowed to overlap indices in the original string, otherwise they must be from distinct character ranges.

Returns: Return a vector of the matching substrings from eachmatch.

朱莉娅

println(matchall(r"[a-z]", "is a letter"))

使用 eachmatch()函数

eachmatch()函数在 RegexMatch 对象上返回一个迭代器,适用于 for 循环。

Syntax:
eachmatch(r::Regex, s::AbstractString, overlap::Bool=false)

Parameters:
r::Regex: Specified regular expression.
s::AbstractString: Specified string.
overlap: Boolean Value. If it is true, the matching sequences are allowed to overlap indices in the original string, otherwise they must be from distinct character ranges.

Returns: Search for all matches of a the regular expression r in s and return a iterator over the matches. 

朱莉娅

for m in eachmatch(r"(cat|dog)s?", "My cats and my dog")
    println("Matched $(m.match) at index $(m.offset)")
end