RegExReplace() [v1.0.45+]

替换字符串中匹配模式(正则表达式) 出现的地方.

NewStr := RegExReplace(Haystack, NeedleRegEx , Replacement := "", OutputVarCount, Limit, StartingPos)

参数

Haystack

源字符串.

NeedleRegEx

要搜索的模式, 它是兼容 Perl 的正则表达式(PCRE). 模式的选项(如果有) 必须放在模式字符串的开始且后面跟着闭括号. 例如, 模式 i)abc.*123 将匹配不区分大小写的 "abc", 接着零个或多个任意字符, 并以 "123" 结尾的字符串. 如果不含选项, 则可以省略 ")"; 例如, )abc 等同于 abc.

Replacement

如果为空或省略, NeedleRegEx 将被替换为空, 这意味着将它从返回值中删除. 否则, 请指定要替换每个匹配项的字符串, 它是纯文本(不是正则表达式).

此参数可以包含像 $1 这样的后向引用, 它引用了 Haystack 中匹配首个子模式的子字符串. 最简单的后向引用是从 $0 到 $9, 其中 $0 是匹配整个模式的子字符串, $1 是匹配首个子模式的子字符串, $2 是第二个, 依此类推. 对于大于 9 的后向引用(对于小于等于 9 的那些, 这是可选的), 需要把数字括在大括号中; 例如 ${10}, ${11}, 依此类推. 对于命名子模式, 需要将名称括在大括号中; 例如 ${SubpatternName}. 要指定原义的 $, 请使用 $$(这是唯一需要特殊处理的字符; 反斜杠不需要转义).

要转换子模式的大小写, 请在 $ 后跟着下列字符的其中一个: U 或 u(大写), L 或 l(小写), T 或 t(标题格式, 此时每个单词的首字母大写, 而把其他的所有字母改成小写). 例如, $U1 和 $U{1} 都会把首个子模式转换成大写的版本.

不存在的后向引用和不匹配 Haystack 中任何字符串的模式, 例如 (abc)|(xyz) 中的一个子模式, 会被转译为空字符串.

OutputVarCount

如果省略, 将不会存储对应的值. 否则, 请指定用于存储发生的替换次数的输出变量(如果没有则为 0).

Limit

如果省略, 则它默认为 -1, 此时会替换 Haystack 中 所有 发现匹配模式的地方. 否则, 请指定允许替换的最大次数. Haystack 中最后一次替换位置右边的部分将保持不变.

StartingPos

如果省略, 则它默认为 1(从 Haystack 的首个字符开始). 否则, 从第二个字符开始请指定 2, 第三个开始为 3, 依此类推. 如果 StartingPos 超过了 Haystack 的长度, 则搜索会从 Haystack 末尾后的空字符串开始(这通常会导致没有替换发生).

如果 StartingPos 小于 1, 则它被视为从 Haystack 末尾开始的偏移. 例如, 0 表示从最后一个字符开始而 -1 则从倒数第二个字符开始. 如果 StartingPos 超出了 Haystack 最左边的位置, 则会搜索整个 Haystack.

不论 StartingPos 的值是什么, 返回值总是 Haystack 的完整副本, 唯一的区别是比起 StartingPos 为 1 时发生的情况此时源字符串左边可能更多的部分保持不变.

返回值

函数将返回 Haystack 被替换之后的值. 如果没有发生替换, 将返回 Haystack 的原始值. 如果发生错误(比如 NeedleRegEx 出现语法错误), 同样返回 Haystack 的原始值(除非是 1.0.46.06 之前的版本, 将返回 "" 空字符串) 同时 ErrorLevel 被设为下面列表中除了 0 之外的值.

错误处理

[v1.1.04+]: 此函数失败时会抛出异常(这个不会和 "没有找到匹配" 冲突, 失败表示匹配过程中遇到问题, 而 "没有找到匹配" 表示匹配过程成功完成只是没有发现匹配). 想了解更多信息, 请参阅运行时错误.

ErrorLevel 被设置为下列值的其中一个:

选项

请参阅RegEx Quick Reference中的选项, 例如 i)abc, 关闭了区分大小写匹配.

性能

要进行简单的子字符串替换, 请使用 StrReplace() 或 StringReplace, 因为它比 RegExReplace() 执行地更快.

如果您知道替换的最大次数是多少, 请在 Limit 参数中指定来提高性能, 因为这样可以早一些停止搜索(这样也可能会降低在替换操作过程中占用的系统内存). 例如, 如果您知道在一个大字符串的开始处仅有一个匹配, 请指定最大次数为 1.

为了提升性能, 最近使用的 100 个正则表达式会被缓存在内存中(以已编译的形式).

多次使用一个正则表达式时(例如在循环中), 使用研究选项(S) 可以提高性能.

备注

大多数字符(例如 abc123) 可以直接使用在正则表达式中. 然而, 集合 \.*?+[{|()^$ 中的任何字符则必须在其前面加上反斜杠才能被视为原义文字. 例如, \. 表示一个原义的句点, 而 \\ 表示一个原义的反斜杠. 使用 \Q...\E 能避免转义. 例如: \QLiteral Text\E.

在正则表达式中, 特殊字符(如制表符和换行符) 可以使用一个重音符(`) 或反斜杠(\) 进行转义. 例如, 当 x 选项不使用时, `t 等同于 \t.

要了解正则表达式的基础(或复习正则表达式的语法), 请参阅正则表达式快速参考.

RegExMatch(), 正则表达式快速参考, 正则表达式调出, StrReplace(), InStr(), StringReplace

文本数据的常见来源: FileRead, UrlDownloadToFile, Clipboard, GUI Edit 控件

示例

有关普通 RegEx 的示例, 请参阅正则表达式快速参考.

报告 "abc123xyz", 因为 $ 导致只能在末尾形成匹配.

MsgBox % RegExReplace("abc123123", "123$", "xyz")

报告 "123" 因为通过不区分大小写选项实现了匹配.

MsgBox % RegExReplace("abc123", "i)^ABC")

报告 "aaaXYZzzz" 使用 $1 后向引用.

MsgBox % RegExReplace("abcXYZ123", "abc(.*)123", "aaa$1zzz")

报告空字符串并保存 2 到 ReplacementCount.

MsgBox % RegExReplace("abc123abc456", "abc\d+", "", ReplacementCount)