# regexprep
使用正则表达式替换文本
函数库: TyBase
# 语法
newStr = regexprep(str,expression,replace)
newStr = regexprep(str,expression,replace,option1,...,optionM)
# 说明
newStr = regexprep(str,expression,replace) 将 str 中与 expression 匹配的文本替换为 replace 描述的文本。regexprep 函数在 newStr 中返回更新的文本。 示例
如果 str 是一段文本(字符串),则 newStr 也是一段相同类型的文本。即使 expression 或 replace 是其他文本,newStr 也是一段文本。
如果不存在与 expression 的匹配项,则 newStr 等同于 str。
newStr = regexprep(str,expression,replace,option) 使用指定的选项修改搜索。例如,指定 "ignorecase" 以执行不区分大小写的匹配。 示例
# 示例
更新的文本
替换以 M 开头和以 y 结尾且其中至少有一个字符的单词。
using TyBase
str = "My flowers may bloom in May";
expression = r"M(\w+)y";
replace1 = "April";
newStr = regexprep(str, expression, replace1)
"My flowers may bloom in April"
在替代文本中包括标文
通过在标文中捕获紧随 "walk" 的字母来替换短语 "walk up" 的变体。
using TyBase
str = "I walk up, they walked up, we are walking up.";
expression = r"walk(\w*) up";
replace1 = "ascend\$1";
newStr = regexprep(str, expression, replace1)
"I ascend, they ascended, we are ascending."
在替代文本中包括动态表达式
使用 upper 函数将句子开头的小写字母替换为其大写形式。
using TyBase
str = "here are two sentences. neither is capitalized.";
expression = r"(^|\.)\s*.";
replace1 = "\$0";
func = uppercase
newStr = regexprep(str, expression, replace1; func = func)
"Here are two sentences. Neither is capitalized."
该正则表达式匹配紧随字符向量 (^) 开头的单个字符 (.) 或句点 (.) 和任何空白 (\s*)。replace 表达式调用 upper 函数以获取当前匹配的字符 ($0)。
更新多段文本
将一组字符向量中的每个双重复字母替换为符号 "--"。
using TyBase
str = ["Whose woods these are I think I know."
"His house is in the village though;"
"He will not see me stopping here"
"To watch his woods fill up with snow."];
expression = r"(.)\1";
replace1 = "--";
newStr = regexprep(str, expression, replace1)
4-element Vector{String}:
"Whose w--ds these are I think I know."
"His house is in the vi--age though;"
"He wi-- not s-- me sto--ing here"
"To watch his w--ds fi-- up with snow."
保留原始文本中的大小写
在查找匹配项时忽略正则表达式中的字母大小写,但在更新时模拟原始文本的字母大小写。
using TyBase
str = "My flowers may bloom in May";
expression = r"M(\w+)y";
replace1 = "April";
newStr = regexprep(str, expression, replace1, "preservecase")
"My flowers april bloom in April"
替换零长度匹配项
使用 "^" 运算符在字符向量开头插入文本,这将返回零长度匹配项,以及 "emptymatch" 关键字。
using TyBase
str = "abc";
expression = r"^";
replace1 = "__";
newStr = regexprep(str, expression, replace1, "emptymatch")
"__abc"
# 输入参数
str - 要更新的文本字符串标量
要更新的文本,指定为字符串数组。
数据类型: 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。您可以在左括号后包括 ?: 或 ?> 以禁用标文或以原子方式分组。 | "(let|tel)\w+" 匹配以 let 或 tel 开头的单词。 |
# 定位点
表达式中的定位点与文本或单词的开头或结尾匹配。
| 定位点 | 与以下项匹配 | 示例 |
|---|---|---|
| ^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。 | "Mr(s?)..*?(?(1)her |
# 标文运算符
标文是您通过将正则表达式的部分括在括号中而定义的匹配文本的部分。您可以按标文在文本中的顺序引用该标文(顺序标文),或将名称分配给标文以便于代码维护和使输出更易于阅读。
| 顺序标文运算符 | 说明 | 示例 |
|---|---|---|
| (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|his) \w" 匹配包含 her 的文本(当文本以 Mrs 开头时),或包含 his 的文本(当文本以 Mr 开头时)。 |
| 命名标文运算符 | 说明 | 示例 |
|---|---|---|
| (?< 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。 | "Mr(?<\sex>s?)..?(?(sex)her|his) \w" 匹配包含 her 的文本(当文本以 Mrs 开头时),或包含 his 的文本(当文本以 Mr 开头时)。 |
# 动态正则表达式
动态表达式允许您执行 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
replace - 替代文本字符串标量
替代文本,指定为字符串,如下所示:
如果 replace 为单个字符且 expression 为字符串,则 regexprep 对每个表达式使用相同的替代文本;
如果 replace 为 N 字符串且 expression 为单个字符,则 regexprep 尝试 N 次匹配和替代;
如果 replace 和 expression 均为字符串,则它们必须包含相同数量的元素。regexprep 将每个 replace 元素与 expression 中与其匹配的元素配对;
替代文本可以包括常规字符、特殊字符(例如制表符或换行符)或替代运算符,如下表所示。
| 替代运算符 | 说明 |
|---|---|
| $& 或 $0 | 当前作为匹配项的输入文本部分 |
| $` | 位于当前匹配项之前的输入文本部分 |
| $" | 紧随当前匹配项的输入文本部分(使用 $"" 表示 $") |
| $N | 第 N 个标文 |
| $<\name> | 命名标文 |
| ${cmd} | 在 Syslab 执行命令 cmd 时返回的输出 |
| 运算符 | 说明 |
|---|---|
| \a | 警报(蜂鸣) |
| \b | 退格符 |
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \char | 正则表达式中您要从字面上匹配(例如,使用 \ 匹配单个反斜杠)的具有特殊含义的任意字符。 |
数据类型: String
option - 搜索或替代选项"once" | "warnings" | "ignorecase" | "preservecase" | "emptymatch" | "dotexceptnewline" | "lineanchors" | ...
搜索或替代选项,指定为一个字符向量或整数值,如下表所示。
选项成组出现:一个选项对应于默认行为,一个或两个选项允许您覆盖默认值。仅指定一组中的一个选项。选项可以按任意顺序显示。
| 默认值 | 覆盖 | 说明 |
|---|---|---|
| "all" | "once" | 尽可能多次地匹配和替换表达式(默认值),或仅匹配和替换一次。 |
| "matchcase" | "ignorecase" | 匹配字母大小写(默认值),或在匹配和替换时忽略大小写。 |
| "matchcase" | "preservecase" | 在匹配时忽略大小写,但在替换时保留对应字符在原始文本中的大小写。 |
| "noemptymatch" | "emptymatch" | 忽略零长度匹配项(默认值),或包括这些匹配项。 |
| "dotall" | "dotexceptnewline" | 将点与任意字符匹配(默认值),或与除换行符 (\n) 之外的所有字符匹配。 |
| "stringanchors" | "lineanchors" | 将 ^ 和 $ 元字符应用于字符向量的开头和结尾(默认值),或应用于行开头和结尾。换行符 (\n) 指定行的结尾。行的开头指定为第一个字符,或紧跟在换行符后面的任何字符。 |
| "literalspacing" | "freespacing" | 在匹配时包括空格字符和注释(默认值),或忽略它们。借助 freespacing,使用 "\ " 和 "#" 匹配空格和 # 字符。 |
数据类型: String
# 输出参数
newStr - 更新的文本字符串标量
更新后的文本,以字符串的形式返回。newStr 的数据类型与 str 的数据类型相同。