使用正则表达式与VBScript修复格式错误的罗马数字
修复VBScript正则替换罗马数字为全大写的问题
你遇到的问题核心是VBScript正则替换的参数处理逻辑:当你直接用UCase("$1$2$3$4")作为替换内容时,UCase会先把字符串"$1$2$3$4"本身转大写(但这些符号大写后和原字符串完全一样),之后正则引擎才会替换捕获组的值,相当于把匹配到的罗马数字原样放回,所以结果和输入一致。
要解决这个问题,需要用自定义替换函数来处理每个匹配项的大写转换,而不是直接传字符串参数。以下是修改后的完整脚本:
Set re = New RegExp re.Pattern = "\b(?=[MDCLXVI])(M{0,3})(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})\b" re.IgnoreCase = True re.Global = True ' 定义替换函数,接收匹配对象并返回大写后的内容 Function FixRomanCase(matchObj) FixRomanCase = UCase(matchObj.Value) End Function str = "some text Part I, some text Part Ii, some more text IiI, anything DXiV" result = re.Replace(str, GetRef("FixRomanCase")) ' 输出结果:some text Part I, some text Part II, some more text III, anything DXIV WScript.Echo result
关键说明:
GetRef("FixRomanCase")用于将自定义函数转换为正则替换可接收的函数引用- 替换函数
FixRomanCase接收匹配对象matchObj,通过matchObj.Value获取当前匹配到的罗马数字文本,再用UCase转大写后返回 - 你的正则表达式是正确的(替换为"xxx"能生效证明这一点),所以只需要调整替换逻辑即可
内容的提问来源于stack exchange,提问作者Dmitry Arch
相关产品推荐
相关产品推荐

