You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jrepl批量替换时遇‘搜索替换/T表达式不匹配’错误求助

解决JRepl整合替换规则时的"Mismatched search and replace /T expressions"错误

原多命令替换实现

原本通过多条JRepl命令完成各类字符替换,代码如下:

call "jrepl.bat" "\xE2\x80\x9D \xE2\x80\x9C" "\x22\x22 \x22\x22" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
call "jrepl.bat" "\xE2\x80\x93 \xE2\x80\x94" "- -" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
call "jrepl.bat" "\xE2\x80\x99" "'" /x /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
call "jrepl.bat" "\xE2\x84\xA2" "(TM)" /x /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
call "jrepl.bat" "\xC2\xB0" " grados" /x /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
call "jrepl.bat" "\xC3\xA1 \xC3\xA9 \xC3\xAD \xC3\xB3 \xC3\xBA \xC3\xB1" "a e i o u n" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
call "jrepl.bat" "\xC3\x81 \xC3\x89 \xC3\x8D \xC3\x93 \xC3\x9A \xC3\x91" "A E I O U N" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o -

整合替换规则的尝试

为简化操作,将所有替换规则整合到以#分隔的reemplazos变量中:

set "reemplazos=\xE2\x80\x9D \xE2\x80\x9C=\x22\x22 \x22\x22#\xE2\x80\x93 \xE2\x80\x94=- -#\xE2\x80\x99='#\xE2\x84\xA2=(TM)#\xC2\xB0= grados#\xC3\xA1 \xC3\xA9 \xC3\xAD \xC3\xB3 \xC3\xBA \xC3\xB1=a e i o u n#\xC3\x81 \xC3\x89 \xC3\x8D \xC3\x93 \xC3\x9A \xC3\x91=A E I O U N"

随后调用单条JRepl命令时出现报错:

call "jrepl.bat" "%reemplazos%" "$txt=$0.replace(/(?<=\#)?([^#]+)(?=\#)?/g,function(m,g1){return g1.split('=')[1]})" /jq /t "#" /x /f "%CurDir%\%marca%Consolidado-OK.csv" /o -

错误信息:

JScript runtime error: Mismatched search and replace /T expressions

错误原因

/t "#"参数的作用是让JRepl将搜索表达式和替换表达式分别按#拆分成多组,要求两组拆分后的数量完全匹配。但你当前的用法是把所有规则塞进搜索表达式,替换表达式是一段JS脚本,拆分后搜索项数量远多于替换项,导致匹配失败,触发错误。

解决方法

放弃/t "#"参数,改用JScript脚本直接解析替换规则并批量处理。以下两种方案都可以实现需求:

方案1:直接在脚本中定义替换映射

call "jrepl.bat" "^.*$" "
    // 定义所有替换规则的键值对
    var replacements = {
        '\u201D \u201C': '"" ""',
        '\u2013 \u2014': '- -',
        '\u2019': "'",
        '\u2122': '(TM)',
        '\u00B0': ' grados',
        '\u00E1 \u00E9 \u00ED \u00F3 \u00FA \u00F1': 'a e i o u n',
        '\u00C1 \u00C9 \u00CD \u00D3 \u00DA \u00D1': 'A E I O U N'
    };
    var txt = $0;
    // 遍历所有规则执行替换
    for (var key in replacements) {
        // 转义正则特殊字符,避免匹配异常
        var regex = new RegExp(key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
        txt = txt.replace(regex, replacements[key]);
    }
    return txt;
" /jq /x /f "%CurDir%\%marca%Consolidado-OK.csv" /o -

方案2:解析预定义的reemplazos变量

如果希望保留reemplazos变量的定义,可在脚本中拆分并解析规则:

set "reemplazos=\xE2\x80\x9D \xE2\x80\x9C=\x22\x22 \x22\x22#\xE2\x80\x93 \xE2\x80\x94=- -#\xE2\x80\x99='#\xE2\x84\xA2=(TM)#\xC2\xB0= grados#\xC3\xA1 \xC3\xA9 \xC3\xAD \xC3\xB3 \xC3\xBA \xC3\xB1=a e i o u n#\xC3\x81 \xC3\x89 \xC3\x8D \xC3\x93 \xC3\x9A \xC3\x91=A E I O U N"

call "jrepl.bat" "^.*$" "
    var rules = '%reemplazos%'.split('#');
    var txt = $0;
    for (var i=0; i<rules.length; i++) {
        var parts = rules[i].split('=');
        if (parts.length === 2) {
            var searchStr = parts[0];
            var replaceStr = parts[1];
            // 转义正则特殊字符
            var regex = new RegExp(searchStr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
            txt = txt.replace(regex, replaceStr);
        }
    }
    return txt;
" /jq /x /f "%CurDir%\%marca%Consolidado-OK.csv" /o -

两种方案均会遍历所有替换规则,对目标文件内容一次性完成所有替换操作,效率与原多命令方式一致,但代码更简洁。

内容的提问来源于stack exchange,提问作者Mikel Urbieta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:18:09