# regexp
匹配正则表达式(区分大小写)
函数库: TyBase
# 语法
startIndex = regexp(str,expression)
out = regexp(str,expression,outkey)
out1,...,outN = regexp(str,expression,outkey1,...,outkeyN)
___ = regexp(___,option1,...,optionM)
# 说明
startIndex = regexp(str,expression) 返回 str 中与该正则表达式指定的字符模式匹配的每个子字符串的起始索引。如果没有匹配项,则 startIndex 为空数组。 示例
out = regexp(str,expression,outkey) 返回 outkey 指定的输出。例如,如果 outkey 为 "match",则 regexp 返回与该表达式匹配的子字符串而非其开始索引。 示例
out1,...,outN = regexp(str,expression,outkey1,...,outkeyN) 按指定的顺序返回多个输出关键字指定的输出。例如,如果您指定 "match"、"tokens",则 regexp 返回与整个表达式匹配的子字符串以及与部分表达式匹配的标文。 示例
___ = regexp(___,option1,...,optionM) 使用指定的选项标志修改搜索。例如,指定 "ignorecase" 以执行不区分大小写的匹配。您可以包括任何输入并请求之前语法中的任何输出。 示例
# 示例
查找文本中的模式
查找以 c 开头并以 t 结尾且其中包含一个或多个元音的单词。
using TyBase
str = "bat cat can car coat court CUT ct CAT-scan";
expression = r"c[aeiou]+t";
startIndex, = regexp(str, expression)
2-element Vector{Int64}:
5
17
正则表达式 "c[ aeiou ]+t" 指定以下模式:
c 必须为第一个字符;
c 必须后跟方括号内的一个字符 [ aeiou ];
括起的模式必须出现一次或多次,如 + 运算符所指示;
t 必须为最后一个字符,括起的模式和 t 之间没有任何字符。
startIndex 中的值指示与正则表达式匹配的每个单词的第一个字符的索引。匹配单词 cat 在索引 5 处开始,coat 在索引 17 处开始。单词 CUT 和 CAT 不匹配,因为它们是大写的。
查找多段文本中的模式
查找大写字母和空格在向量中的字符串中的位置。
using TyBase
str = ["Madrid, Spain", "Romeo and Juliet", "SYSLAB is great"];
capExpr = r"[A-Z]";
spaceExpr = r"\s";
capStartIndex = regexp(str, capExpr);
spaceStartIndex = regexp(str, spaceExpr);
查看大写字母的索引。
display(capStartIndex)
3-element Vector{Vector{Int64}}:
[1, 9]
[1, 11]
[1, 2, 3, 4, 5, 6]
查看空格的索引。
display(spaceStartIndex)
3-element Vector{Vector{Int64}}:
[8]
[6, 10]
[7, 10]
使用match关键字返回子字符串
捕获字符串中包含字母 x 的单词。
using TyBase
str = "EXTRA! The regexp function helps you relax.";
expression = r"\w*x\w*";
matchStr = regexp(str, expression, "match")
2-element Vector{String}:
"regexp"
"relax"
正则表达式 "\wx\w" 指定该字符串:
以任意数量的字母数字或下划线字符开头,\w*。
包含小写字母 x。
以 x 后的任意数量的字母数字或下划线字符结尾,包括无任何内容,如 \w* 指示。
使用 split 关键字在分隔符处拆分文本
将字符串拆分为多个子字符串,其中每个子字符串以 ^ 字符分隔。
using TyBase
str = "Split ^this text into ^several pieces";
expression = r"\^";
splitStr = regexp(str, expression, "split")
"Split "
"this text into "
"several pieces"
因为克拉符号在正则表达式中具有特殊含义,所以在其前面使用转义字符,即反斜杠 (\)。要在其他分隔符(例如分号)处拆分字符串,则无需包括反斜杠。
返回匹配和非匹配子字符串
使用 "match" 关键字捕获与正则表达式匹配的字符串部分,并使用 "split" 关键字捕获不匹配的剩余部分。
using TyBase
str = "She sells sea shells by the seashore.";
expression = r"[Ss]h.";
match, noMatch = regexp(str, expression, "match", "split")
match =
3-element Vector{String}:
"She"
"she"
"sho"
noMatch =
4-element Vector{String}:
""
" sells sea "
"lls by the sea"
"re."
正则表达式 "[ Ss ]h." 指定:
S 或 s 为第一个字符。
h 为第二个字符。
第三个字符可以为任何字符(包括空格),如点 (.) 指示。
当字符串中的第一个(或最后一个)字符匹配正则表达式时,"split" 关键字的第一个(或最后一个)返回值为空字符串。
或者,从子字符串重新组合原始字符串。
combinedStr = strjoin(noMatch, match)
"She sells sea shells by the seashore."
使用顺序标文捕获匹配项的子字符串
通过在正则表达式中定义标文来查找 HTML 标记的名称。标文用圆括号 () 表示。
using TyBase
str = "<title>My Title</title><p>Here is some text.</p>";
expression = r"<(\w+).*>.*</\1>";
tokens, matches = regexp(str, expression, "tokens", "match");
正则表达式 <(\w+).>.</\1> 指定以下模式:
<(\w+) 查找左尖括号,后跟一个或多个字母数字或下划线字符。将 \w+ 括在圆括号中可在标文中捕获 HTML 标记的名称。
.*> 查找任意数量的附加字符(例如 HTML 属性)以及右尖括号。
</\1> 查找对应于第一个标文的结束标记(用 \1 指示)。结束标记的形式为 < /tagname >。
查看标文和匹配的子字符串。
display(tokens)
2-element Vector{Any}:
[ "title" ]
[ "p" ]
display(matches)
2-element Vector{String}:
"< title >My Title< /title >"
"< p >Here is some text.< /p >"
使用命名标文捕获匹配项的子字符串
解析最先显示天或月的日期,这些日期采用以下格式:mm/dd/yyyy 或 dd-mm-yyyy。使用命名标文标识日期的各部分。
using TyBase
str = "01/11/2000 20-02-2020 03/30/2000 16-04-2020";
# julia 该正则表达式不支持,需拆分开
expression = [r"(?<month>\d+)/(?<day>\d+)/(?<year>\d+)", r"(?<day>\d+)-(?<month>\d+)-(?<year>\d+)"];
tokenNames = regexp.(str, expression, "names");
正则表达式指定以下模式:
(?< name >\d+) 查找一个或多个数字并将结果分配给名称指示的标文。
日期有两种可能模式。在第一个模式中,斜杠 (/) 分隔标文。在第二个模式中,连字符 (-) 分隔标文。
查看命名标文。
for i = 1:length(tokenNames)
for k = 1:length(tokenNames[i])
display(tokenNames[i][k])
end
end
Dict{Any, String} with 3 entries:
"day" => "11"
"month" => "01"
"year" => "2000"
Dict{Any, String} with 3 entries:
"day" => "30"
"month" => "03"
"year" => "2000"
Dict{Any, String} with 3 entries:
"day" => "20"
"month" => "02"
"year" => "2020"
Dict{Any, String} with 3 entries:
"day" => "16"
"month" => "04"
"year" => "2020"
执行不区分大小写的匹配
查找大写和小写形式的单词。
默认情况下,regexp 执行区分大小写的匹配。
using TyBase
str = "A Character vector with UPPERCASE and lowercase text.";
expression = r"\w*case";
matchStr = regexp(str, expression, "match")
1-element Vector{String}:
"lowercase"
正则表达式指定该字符串:
以任意数量的字母数字或下划线字符开头,\w*。
以字面文本 case 结尾。
regexpi 函数使用与 regexp 相同的语法,但执行不区分大小写的匹配。
matchWithRegexpi = regexpi(str, expression, "match")
2-element Vector{String}:
"UPPERCASE"
"lowercase"
或者,使用 'ignorecase' 选项对 regexp 禁用区分大小写的匹配。
matchWithIgnorecase = regexp(str, expression, "match", "ignorecase")
2-element Vector{String}:
"UPPERCASE"
"lowercase"
对于多个表达式,使用 (?i) 搜索标志对选定表达式禁用区分大小写的匹配。
expression = [r"(?-i)\w*case", r"(?i)\w*case"];
matchStr = regexp.(str, expression, "match");
display(matchStr)
2-element Vector{Vector{String}}:
[ "lowercase" ]
["UPPERCASE", "lowercase"]
解析包含换行符的文本
创建一个包含换行符 \n 的字符串,并使用正则表达式解析该字符串。由于 regexp 将 matchStr 返回为包含具有多行文本的数组,因此您可以将文本从数组中取出以显示所有行。
using TyBase
str = "abc\n de";
expression = r".*";
matchStr = regexp(str, expression, "match");
matchStr[1]
"abc\n de"
默认情况下,点 (.) 与每个字符(包括换行符)匹配,并返回等同于原始字符串的单个匹配项。
使用 "dotexceptnewline" 选项从匹配项中排除换行符。这返回每行文本的单独匹配项。
matchStrNoNewline = regexp(str, expression, "match", "dotexceptnewline")
2-element Vector{String}:
"abc"
" de"
使用 ^ 或 $ 元字符及 "lineanchors" 选项查找每行的第一个或最后一个字符。
expression = r".$";
lastInLine = regexp(str, expression, "match", "lineanchors")
2-element Vector{String}:
"c"
"e"
返回数组中的匹配项
在一段文本中查找匹配项,并在数组中返回输出。
查找以 c 开头、以 t 结尾且在这两个字母之间包含有一个或多个元音字母的单词。在数组中返回起始索引。
using TyBase
str = "bat cat can car coat court CUT ct CAT-scan";
expression = r"c[aeiou]+t";
startIndex = regexp(str, expression)
2-element Vector{String}:
5
17
返回匹配和非匹配子字符串。每个输出都位于其自己的数组中。
match, noMatch = regexp(str, expression, "match", "split")
要访问匹配项数组,请对 match 进行索引。
match
"cat"
"coat"
要访问不匹配的子字符串,请对 noMatch 进行索引。
noMatch
"bat "
" can car "
" court CUT ct CAT-scan"
# 输入参数
str-输入文本字符串数组 | 字符串标量
输入文本,指定为字符串或字符串数组。字符串数组中的每个字符串可以为任意长度并包含任意字符。
如果 str 和 expression均为字符串数组,则它们的维度必须相同。
数据类型: String
expression-正则表达式字符串标量
正则表达式,指定为字符串或字符串数组。每个表达式可包含字符、元字符、运算符、标文和用于指定在 str 中匹配的模式的标志。
下表描述了正则表达式的各元素。
# 元字符
| 元字符 | 说明 | 示例 |
|---|---|---|
| . | 任何单个字符,包括空白 | "..ain" 与以 "ain" 结尾的五个连续字符序列匹配。 |
| [c1c2c3] | 包含在方括号中的任意字符。下列字符将按字面意义进行处理:$ | . * + ? 和 -(不用于指示范围时)。 |
| [^c1c2c3] | 未包含在方括号中的任意字符。下列字符将按字面意义进行处理:$ | . * + ? 和 -(不用于指示范围时)。 |
| [c1-c2] | c1 到 c2 范围中的任意字符 | "[A-G]" 与 A 到 G 范围中的单个字符匹配。 |
| \w | 任意字母、数字或下划线字符。对于英语字符集,\w 等同于 [a-zA-Z_0-9] | "\w*" 标识一个单词。 |
| \W | 字母、数字或下划线之外的任意字符。对于英语字符集,\W 等同于 [^a-zA-Z_0-9] | "\W*" 标识非单词项。 |
| \s | 任意空白字符;等同于 [ \f\n\r\t\v] | "\w*n\s" 与以字母 n 结尾且后跟空白字符的单词匹配。 |
| \S | 任意非空白字符;等同于 [^ \f\n\r\t\v] | "\d\S" 与数字(后跟任意非空白字符)匹配。 |
| \d | 任意数字;等同于 [0-9] | "\d*" 与任意数量的连续数字匹配。 |
| \D | 任意非数字字符;等同于 [^0-9] | "\w*\D>" 与不以数字结尾的单词匹配。 |
| \oN 或 \o{N} | 八进制值 N 的字符 | "\o{40}" 与八进制 40 定义的空格字符匹配。 |
| \xN 或 \x{N} | 十六进制值 N 的字符 | "\x2C" 与十六进制 2C 定义的逗号字符匹配。 |
# 字符表示
| 运算符 | 说明 |
|---|---|
| \a | 警报(蜂鸣) |
| \b | 退格符 |
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \Char | 正则表达式中您要从字面上匹配(例如,使用 \ 匹配单个反斜杠)的具有特殊含义的任意字符。 |
# 限定符
限定符指定某个模式必须出现在匹配文本中的次数。
| 限定符 | 再出现以下次数时匹配表达式 | 示例 |
|---|---|---|
| expr* | 0 次或连续多次。 | "\w*" 与任意长度的单词匹配。 |
| expr? | 0 次或 1 次。 | "\w*(.m)?" 与单词或以扩展名 .m 结尾(此条件为可选条件)的单词匹配。 |
| expr+ | 1 次或连续多次。 | "<img src="\w+.gif">" 与 < img > HTML 标记匹配(当文件名包含一个或多个字符时)。 |
| expr{m,n} | 至少 m 次,但不超过连续 n 次。{0,1} 等效于 ?。 | "\S{4,8}" 与四到八个非空白字符匹配。 |
| expr{m,} | 至少连续 m 次。{0,} 和 {1,} 分别等效于 * 和 +。 | "<a href="\w{1,}.html">" 与 < a > HTML 标记匹配(当文件名包含一个或多个字符时)。 |
| expr{n} | 恰好连续 n 次。等效于 {n,n}。 | "\d{4}" 与四个连续数字匹配。 |
限定符可以以三种模式显示,如下表所述。q 表示上表中的任意限定符。
| 模式 | 说明 | 示例 |
|---|---|---|
| exprq | 积极表达式:与尽可能多的字符匹配。 | 给定文本 "< tr >< td >< p >text< /p >< /td >",表达式 "< /?t.* >" 与介于 < tr 和 /td> 之间的所有字符匹配:"< tr >< td >< p >text< /p >< /td >" |
| exprq? | 消极表达式:与所需的尽可能少的字符匹配。 | 给定文本 "< tr >< td >< p >text< /p >< /td >",表达式 "</?t.*?>" 在第一次出现右尖括号 (>) 时结束每个匹配项:"< tr >" "< td >" "< /td>" |
| exprq+ | 主动表达式:最大程度地匹配,但不重新扫描文本的任何部分。 | 给定文本 "< tr >< td >< p >text< /p >< /td >",表达式 "</?t.* +>" 不返回任何匹配项,这是因为右尖括号是使用 .* 捕获的且不进行重新扫描。 |
# 分组运算符
分组运算符允许您捕获标文,将一个运算符应用于多个元素或在特定组中禁止追溯。
| 分组运算符 | 说明 | 示例 |
|---|---|---|
| (expr) | 将表达式元素分组并捕获标文。 | "Joh?n\s(\w*)" 捕获一个标文,该标文包含名字为 John 或 Jon 的任何人的姓氏。 |
| (?:expr) | 分组但不捕获标文。 | "(?:[aeiou][^aeiou]){2}" 与两个连续的元音后跟非元音(例如 "anon")的模式匹配。不进行分组时,"[aeiou][^aeiou]{2}" 与元音后跟两个非元音匹配。 |
| (?>expr) | 以原子方式分组。不在组中追溯以完成匹配,并且不捕获标文。 | "A(?>.)Z" 与 "AtoZ" 不匹配,但 "A(?:.)Z" 与其匹配。使用原子组时,Z 将使用 .* 进行捕获并且不进行重新扫描。 |
| (expr1 | expr2) | 匹配表达式 expr1 或表达式 expr2。如果存在与 expr1 匹配的项,则将忽略 expr2。您可以在左括号后包括 ?: 或 ?> 以禁用标文或以原子方式分组。 |
# 定位点
表达式中的定位点与文本或单词的开头或结尾匹配。
| 定位点 | 与以下项匹配 | 示例 |
|---|---|---|
| ^expr | 输入文本的开头。 | "^M\w*" 与以 M 作为文本开头的单词匹配。 |
| expr$ | 输入文本的结尾。 | "\w*m$" 与以 m 作为文本结尾的单词匹配。 |
| \< expr | 单词开头。 | "<\n\w*"与以n开头的任何单词匹配。 |
| expr> | 单词结尾。 | "\w*e>" 与以 e 结尾的任何单词匹配。 |
# 环顾断言
环顾断言查找紧邻预期匹配项前后但并非该匹配项一部分的模式。
指针停留在当前位置,并且将放弃或不捕获对应于 test 表达式的字符。因此,前向断言可匹配重叠字符组。
| 环顾断言 | 说明 | 示例 |
|---|---|---|
| expr(?=test) | 向前查找与 test 匹配的字符。 | "\w*(?=ing)" 匹配后跟 ing 的词汇,例如输入文本 "Flying, not falling." 中的 "Fly" 和 "fall"。 |
| expr(?!test) | 向前查找与 test 不匹配的字符。 | "i(?!ng)" 匹配字母 i 的不后跟 ng 的实例。 |
| (?<=test)expr | 向后查找与 test 匹配的字符。 | "(?<=re)\w*" 匹配紧跟 "re" 的词汇,例如输入文本 "renew, reuse, recycle" 中的 "new"、"use" 和 "cycle" |
| (?<!test)expr | 向后查找与 test 不匹配的字符。 | "(?<!\d)(\d)(?!\d)" 与一位数字匹配(不紧随其他数字前后的数字)。 |
如果您在表达式之前指定前向断言,则运算等同于逻辑 AND。
| 运算 | 说明 | 示例 |
|---|---|---|
| (?=test)expr | 同时与 test 和 expr 匹配。 | "(?= [a-z])[^aeiou]" 与辅音匹配。 |
| (?!test)expr | 匹配 expr,但不匹配 test。 | "(?![aeiou])[a-z]" 与辅音匹配。 |
# 逻辑和条件运算符
逻辑和条件运算符允许您测试给定条件的状态,然后使用结果确定哪个模式(如果有)与下一条件匹配。这些运算符支持逻辑 OR、if 或 if/else 条件。
条件可以是标文、环顾运算符的动态表达式。动态表达式必须返回逻辑值或数值。
| 条件运算符 | 说明 | 示例 |
|---|---|---|
| expr1|expr2 | 匹配表达式 expr1 或表达式 expr2。如果存在与 expr1 匹配的项,则将忽略 expr2。 | "(let|tel)\w+" 匹配以 let 或 tel 开头的单词。 |
| (?(cond)expr) | 如果条件 cond 为 true,则匹配 expr。 | "(?(?@ispc)[A-Z]:\)" 匹配驱动器名称,例如 C:\(在 Windows® 系统上运行时)。 |
| (?(cond)expr1 | expr2) | 如果条件 cond 为 true,则匹配 expr1。否则,匹配 expr2。 |
# 标文运算符
标文是您通过将正则表达式的部分括在括号中而定义的匹配文本的部分。您可以按标文在文本中的顺序引用该标文(顺序标文),或将名称分配给标文以便于代码维护和使输出更易于阅读。
| 顺序标文运算符 | 说明 | 示例 |
|---|---|---|
| (expr) | 在标文中捕获与括起来的表达式匹配的字符。 | "Joh?n\s(\w*)" 捕获一个标文,该标文包含名字为 John 或 Jon 的任何人的姓氏。 |
| \N | 匹配第 N 个标文。 | "<(\w+).>.</\1>" 从文本 "< title >Some text< /title >" 捕获 HTML 标记的标文,例如 "title"。 |
| (?(N)expr1|expr2) | 如果找到第 N 个标文,则匹配 expr1。否则,匹配 expr2。 | "Mr(s?)..*?(?(1)her |
| 命名标文运算符 | 说明 | 示例 |
|---|---|---|
| (?< name >expr) | 在命名标文中捕获与括起来的表达式匹配的字符。 | "(?< month >\d+)-(?< day >\d+)-(?< yr >\d+)" 在 mm-dd-yy 形式的输入日期中创建命名月、日和年标文。 |
| \k< name > | 匹配 name 引用的标文。 | "<(?< tag >\w+).>.</\k<\tag>>" 从文本 "<\title>Some text</title>" 捕获 HTML 标记的标文,例如 "title"。 |
| (?(name)expr1 | expr2) | 如果找到命名标文,则匹配 expr1。否则,匹配 expr2。 |
# 动态正则表达式
动态表达式允许您执行 Syslab 命令或正则表达式以确定要匹配的文本。
将动态表达式括起来的括号不创建捕获组。
| 运算符 | 说明 | 示例 |
|---|---|---|
| (??expr) | 解析 expr 并将得到的项包括在匹配表达式中。解析后,expr 必须对应于完整的有效正则表达式。使用反斜杠转义字符 () 的动态表达式需要两个反斜杠:一个用于 expr 的初始解析,一个用于完整匹配。 | "^(\d+)((??\w{$1}))" 通过读取匹配项开头的数字确定匹配的字符数。动态表达式括在另一组括号中,以便在标文中捕获生成的匹配项。例如,匹配 "5XXXXX" 将捕获 "5" 和 "XXXXX" 的标文。 |
| (??@cmd) | 执行 cmd 表示的 Syslab 命令,并将该命令返回的输出包括在匹配表达式中。 | "(.{2,}).?(??@fliplr($1))" 查找长度至少为四个字符的回文,例如 "abba"。 |
| (?@cmd) | 执行 cmd 表示的 Syslab 命令,但放弃该命令返回的任何输出。(对诊断正则表达式有帮助。) | "\w*?(\w)(?@disp($1))\1\w*" 匹配包括双字母(例如 pp)的单词并显示中间结果。 |
在动态表达式中,使用下列运算符定义替代文本。
| 替代运算符 | 说明 |
|---|---|
| $& 或 $0 | 当前作为匹配项的输入文本部分 |
| $` | 位于当前匹配项之前的输入文本部分 |
| $" | 紧随当前匹配项的输入文本部分(使用 $"" 表示 $") |
| $N | 第 N 个标文 |
| $<\name> | 命名标文 |
| ${cmd} | 在 Syslab 执行命令 cmd 时返回的输出 |
# 注释
| 字符 | 说明 | 示例 |
|---|---|---|
| (?#comment) | 在正则表达式中插入注释。匹配输入时将忽略注释文本。 | "(?# Initial digit)<\d\w+" 包括一个注释,并匹配以一个数字开头的单词。 |
# 搜索标志
搜索标志修改匹配表达式的行为。在表达式中使用搜索标志的替代方法是传递 option 输入参数。
| 标志 | 说明 |
|---|---|
| (?-i) | 匹配字母大小写(regexp 和 regexprep 的默认值)。 |
| (?i) | 不匹配字母大小写(regexpi 的默认值)。 |
| (?s) | 将模式中的点 (.) 与任意字符匹配(默认值)。 |
| (?-s) | 将模式中的点与并非换行符的任意字符匹配。 |
| (?-m) | 匹配文本开头和结尾的 ^ 和 $ 元字符(默认值)。 |
| (?m) | 匹配行开头和结尾的 ^ 和 $ 元字符。 |
| (?-x) | 在匹配时包括空格字符和注释(默认值)。 |
| (?x) | 在匹配时忽略空格字符和注释。使用 "\ " 和 "#" 匹配空格和 # 字符。 |
该标志修改的表达式可显示在括号后,例如
(?i)\w*
或显示在括号内并使用冒号 (:) 与该标志分隔开,例如
(?i:\w*)
后面的语法允许您更改较大表达式的一部分的行为。
数据类型: String
outkey-指示要返回的输出的关键字 "start" (默认)| "end" | "tokenExtents" | "match" | "tokens" | "names" | "split"
指示要返回的输出的关键字,指定为下列字符串之一。
| 输出关键字 | 返回 |
|---|---|
| "start"(默认值) | 所有匹配项的开始索引,startIndex |
| "end" | 所有匹配项的结束索引,endIndex |
| "tokenExtents" | 所有标文的开始和结束索引 |
| "match" | 与 expression 中的模式匹配的每个子字符串的文本 |
| "tokens" | str 中每个捕获的标文的文本 |
| "names" | 每个命名标文的名称和文本 |
| "split" | str 的非匹配子字符串的文本 |
数据类型: String
option - 搜索或替代选项"once" | "ignorecase" | "preservecase" | "emptymatch" | "dotexceptnewline" | "lineanchors" | ...
搜索或替代选项,指定为一个字符串或整数值,如下表所示。
选项成组出现:一个选项对应于默认行为,一个或两个选项允许您覆盖默认值。仅指定一组中的一个选项。选项可以按任意顺序显示。
| 默认值 | 覆盖 | 说明 |
|---|---|---|
| "all" | "once" | 尽可能多次地匹配和替换表达式(默认值),或仅匹配和替换一次。 |
| "matchcase" | "ignorecase" | 匹配字母大小写(默认值),或在匹配和替换时忽略大小写。 |
| "matchcase" | "preservecase" | 在匹配时忽略大小写,但在替换时保留对应字符在原始文本中的大小写。 |
| "noemptymatch" | "emptymatch" | 忽略零长度匹配项(默认值),或包括这些匹配项。 |
| "dotall" | "dotexceptnewline" | 将点与任意字符匹配(默认值),或与除换行符 (\n) 之外的所有字符匹配。 |
| "Stringanchors" | "lineanchors" | 将 ^ 和 $ 元字符应用于字符串的开头和结尾(默认值),或应用于行开头和结尾。换行符 (\n) 指定行的结尾。行的开头指定为第一个字符,或紧跟在换行符后面的任何字符。 |
| "literalspacing" | "freespacing" | 在匹配时包括空格字符和注释(默认值),或忽略它们。借助 freespacing,使用 "\ " 和 "#" 匹配空格和 # 字符。 |
数据类型: String
# 输出参数
startIndex-每个匹配项的开始索引行向量
每个匹配项的开始索引,以行向量或数组的形式返回,如下所示:
如果 str 和 expression 均为字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。
如果 str 是字符串数组,另一个是字符串标量,则输出是数组。输出数组与输入数组具有相同的维度。
endIndex-每个匹配项的结束索引行向量
每个匹配项的开始索引,以行向量或数组的形式返回,如下所示:
如果 str 和 expression 均为字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。
如果 str 是字符串数组,另一个是字符串标量,则输出是数组。输出数组与输入数组具有相同的维度。
out-有关匹配项的信息数值数组 | 字符串数组 | 字典
有关匹配项的信息,以数值、字符串或字典的形式返回。输出中的信息取决于您为 outkey 指定的值,如下所示。
| 输出关键词 | 输出说明 | 输出类型和维度 |
|---|---|---|
| "start" | 匹配项的开始索引 | 如果 str 和 expression 均为字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。 如果 str 或 expression 有一个是字符串数组,另一个是字符串标量,则输出是行向量数组。输出数组与输入数组具有相同的维度。 如果 str 和 expression 均为字符串数组,则它们的维度必须相同。输出是具有相同维度的数组。 |
| "end" | 匹配项的结束索引 | 如果 str 和 expression 均为字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。 如果 str 或 expression 有一个是字符串数组,另一个是字符串标量,则输出是行向量数组。输出数组与输入数组具有相同的维度。 如果 str 和 expression 均为字符串数组,则它们的维度必须相同。输出是具有相同维度的数组。 |
| "tokenExtents" | 所有标文的开始和结束索引 | 默认情况下,当返回所有匹配项时:如果 str 和 expression 均为字符串标量,则输出是一个 1×n 数组,其中 n 是匹配项数。每个包含一个 m×2 数值索引数组,其中 m 是匹配项中的标文数。 如果 str 或 expression 是字符串数组,则输出是一个与输入数组具有相同维度的数组。每个包含一个 1×n 数组,其中每个内部包含一个 m×2 数值数组。 如果 str 和 expression 均为字符串数组,则它们的维度必须相同。输出是具有相同维度的数组。 当指定 "once" 选项仅返回一个匹配项时,输出为一个 m×2 数值数组或一个与 str 和 / 或 expression 具有相同维度的数组。 如果在特定索引 N 处需要标文,但未找到,则 Syslab 返回该标文的范围 [N,N-1]。 |
| "match" | 与 expression 中的模式匹配的每个子字符串的文本 | 默认情况下,当返回所有匹配项时: 如果 str 和 expression 均为字符串标量,则输出是一个 1×n 数组,其中 n 是匹配项数。 如果 str 为字符串,则输出为字符串数组。如果 str 为字符串标量,则输出为字符串数组。 如果 str 或 expression 有一个是字符串数组,另一个是字符串标量,则输出是一个数组,其维数与作为数组的参数相同。 如果 str 是字符串,则输出是字符串数组。如果 str 为字符串数组,则输出为数组,其中每个包含一个字符串数组。 如果 str 和 expression 均为字符串数组,则它们的维度必须相同。输出是具有相同维度的数组。 如果您指定 "once" 选项以便只返回一个匹配项,则输出为字符串、字符串数组或与 str 和 expression 具有相同维度的数组。 |
| "tokens" | str 中每个捕获的标文的文本 | 默认情况下,当返回所有匹配项时:如果 str 和 expression 均为字符串标量,则输出是一个 1×n 数组,其中 n 是匹配项数。每个包含一个 1×m 匹配项数组,其中 m 是匹配项中的标文数。 如果 str 为字符串,则输出为字符串数组。如果 str 为字符串数组,则输出为数组,其中每个元素包含一个字符串数组。 如果 str 或 expression 有一个是字符串数组,另一个是字符串标量,则输出是一个数组,其维数与作为数组的参数相同。每个元素包含一个 1×n 数组,其中每个内部元素包含一个 1×m 数组。 如果 str 是字符串,则每个内部元素包含一个 1×m 数组。如果 str 为字符串数组,则每个内部元素包含一个 1×m 字符串数组。 如果 str 和 expression 字符串数组,则它们的维度必须相同。输出是具有相同维度的数组。 如果您指定 "once" 选项以便只返回一个匹配项,则输出为一个 1×m 字符串数组与 str 和/或 expression 具有相同维度的数组。如果在特定索引处需要有标文,但未找到,Syslab 将为标文返回空值:对于字符串,返回 ""。 |
| "names" | 每个命名标文的名称和文本 | 对于所有匹配项: 如果 str 和 expression 均为字符串标量,则输出是一个 字典,其中 n 是匹配项数。字典键值对应于标文名称。 如果 str 或 expression 有一个是字符串数组,另一个是字符串标量,则输出是一个数组,其维数与作为数组的参数相同。每个元素包含一个字典。 如果 str 和 expression 均为字符串数组,则它们的维度必须相同。输出是具有相同维度的数组。 |
| "split" | str 的非匹配子字符串的文本 | 对于所有匹配项:如果 str 和 expression 均为字符串标量,则输出是一个 1×n 数组,其中 n 是非匹配项数。 如果 str 为字符串,则输出为字符串数组。如果 str 为字符串标量,则输出为字符串数组。 如果 str 或 expression 有一个是字符串数组,另一个是字符串标量,则输出是一个数组,其维数与输入数组相同。每个元素包含一个 1×n 字符串数组。 如果 str 是字符串,则输出是字符串数组。如果 str 为字符串数组,则输出为数组,其中每个元素包含一个字符串数组。 如果 str 为字符串数组,则输出也为字符串数组。如果 str 为字符串数组,则输出为数组,其中每个元素包含一个字符串数组。 |
# 提示
可以使用 strfind 查找文本中的精确字符匹配项。使用 regexp 可查找字符模式。
# 算法
从左向右解析每个输入字符串,并尝试将该字符串中的文本与正则表达式的第一个元素匹配。在此过程中, 跳过不匹配的任何文本。
如果发现第一部分匹配,则继续解析以匹配该表达式的第二部分,以此类推。