用同一行开头的匹配项替换一行中的所有斜杠

Replace all slashes on a line with a match on at the beginning of the same line

我正在尝试更改一行中的所有斜杠,以替换为每行开头的 3 个字符块。 (下面示例中的 PMC、PAJ 等)

.PMC.89569XX/90051XX/90204XX/89533XX/90554XX/90053XX/90215XX/89874XX/89974XX/90481XX/90221XX/90508XX/90183XX/88526XX/89841XX/8 90446XX/88515XX/89574XX/89847XX/88616XX/90513XX/90015XX/90334XX/89649XX.T00
.PAJ.77998XX/77896XX.T00 .PAG.78116XX/78104XX/77682XX/07616XX/77663XX/77863XX/07634XX/78088XX/77746XX/78148XX.T00 。 /22387XX/22070XX/22636XX/22629XX/22487XX/22725XX.T00

期望的结果应该是:

PMC.89569XXPMC90051XXPMC90204XXPMC89533XXPMC90554XXPMC90053XXPMC90215XXPMC89874XXPMC89974XXPMC90481XXPMC90221XXPMC90508XXPMC90183XXPMC88526XXPMC89843XXPMC88041XXPMC90446XXPMC88515XXPMC89574XXPMC89847XXPMC88616XXPMC90513XXPMC90015XXPMC90334XXPMC89649XX.T00

我不确定如何完成此操作。 这是我目前所拥有的:

 (.)([A-Z]{3})(.)(\/)

我不确定您是否可以仅使用一个正则表达式来完成,并且您可能必须分两步完成。首先,您可以使用 substring() 方法捕获三个大写字母,然后您可以将所有斜杠替换为出现在第一个点之后字符开头的三个字母。这是一个带有JS代码的演示,

function transformLine(s) {
    var repStr = s.substring(1,4);
    var replacedStr = s.replace(/\//g, repStr);

    return replacedStr.substring(1,replacedStr.length);
}

var lines = [".PMC.89569XX/90051XX/90204XX/89533XX/90554XX/90053XX/90215XX/89874XX/89974XX/90481XX/90221XX/90508XX/90183XX/88526XX/89843XX/88041XX/90446XX/88515XX/89574XX/89847XX/88616XX/90513XX/90015XX/90334XX/89649XX.T00", ".PAJ.77998XX/77896XX.T00", ".PAG.78116XX/78104XX/77682XX/07616XX/77663XX/77863XX/07634XX/78088XX/77746XX/78148XX.T00", ".PKC.22762XX/22358XX/22055XX/22672XX/22684XX/22154XX/22608XX/22768XX/22632XX/22266XX/22714XX/22658XX/22631XX/22288XX/22020XX/22735XX/22269XX/22138XX/22331XX/22387XX/22070XX/22636XX/22629XX/22487XX/22725XX.T00"];

for (var i = 0;i<lines.length;i++) {
    console.log("Before: " + lines[i]);
    console.log("After: " + transformLine(lines[i])+"\n\n");
}

我已经替换了第一个点,因为您的预期输出中没有它。

让我知道这是否适合你。

编辑:

我更新了代码以提供一个将字符串作为输入并 returns 修改后的字符串的函数。请检查演示。

Edit2:主要使用正则表达式解决它

函数中的这一行会为您完成将行转换为所需行的所有工作。

function transformLine(s) {
    return s.replace(/\//g, /^.(.{3})/.exec(s)[1]).replace(/^./,'');
}

var lines = [".PMC.89569XX/90051XX/90204XX/89533XX/90554XX/90053XX/90215XX/89874XX/89974XX/90481XX/90221XX/90508XX/90183XX/88526XX/89843XX/88041XX/90446XX/88515XX/89574XX/89847XX/88616XX/90513XX/90015XX/90334XX/89649XX.T00", ".PAJ.77998XX/77896XX.T00", ".PAG.78116XX/78104XX/77682XX/07616XX/77663XX/77863XX/07634XX/78088XX/77746XX/78148XX.T00", ".PKC.22762XX/22358XX/22055XX/22672XX/22684XX/22154XX/22608XX/22768XX/22632XX/22266XX/22714XX/22658XX/22631XX/22288XX/22020XX/22735XX/22269XX/22138XX/22331XX/22387XX/22070XX/22636XX/22629XX/22487XX/22725XX.T00"];

for (var i = 0;i<lines.length;i++) {
    console.log("Before: " + lines[i]);
    console.log("After: " + transformLine(lines[i])+"\n\n");
}

正如你在这里看到的,这一行,

return s.replace(/\//g, /^.(.{3})/.exec(s)[1]).replace(/^./,'');

完成您需要的所有工作。它首先使用这个 /^.(.{3})/.exec(s)[1] 提取三个大写字母,然后所有斜线都用这个捕获的单词替换,最后使用这个 /^./,'' 删除第一个字符,最后是 returns 字符串你需要。

如果这是您想要的,请告诉我。否则,如果您以任何特定方式进一步想要它,请告诉我。

如果您只打算支持 ECMAScript 2018 及更新版本,您可以使用一个正则表达式来实现您的需求:

.replace(/(?<=^\.([^.]+)\..*?)\//g, "")

参见regex demo

详情

  • (?<=^\.([^.]+)\..*?) - 正向后视,紧靠当前位置的左侧,需要
    • ^ - 字符串开头
    • \. - 一个点
    • ([^.]+) - 第 1 组:除点以外的一个或多个字符
    • \. - 一个点
    • .*? - 任何 0+ 个字符,换行字符除外,尽可能少
  • \/ - 一个 / 字符。

JS 演示:

var strs = ['.PMC.89569XX/90051XX/90204XX/89533XX/90554XX/90053XX/90215XX/89874XX/89974XX/90481XX/90221XX/90508XX/90183XX/88526XX/89843XX/88041XX/90446XX/88515XX/89574XX/89847XX/88616XX/90513XX/90015XX/90334XX/89649XX.T00','.PAJ.77998XX/77896XX.T00','.PAG.78116XX/78104XX/77682XX/07616XX/77663XX/77863XX/07634XX/78088XX/77746XX/78148XX.T00','.PKC.22762XX/22358XX/22055XX/22672XX/22684XX/22154XX/22608XX/22768XX/22632XX/22266XX/22714XX/22658XX/22631XX/22288XX/22020XX/22735XX/22269XX/22138XX/22331XX/22387XX/22070XX/22636XX/22629XX/22487XX/22725XX.T00'];
for (var s of strs) {
 console.log(s.replace(/(?<=^\.([^.]+)\..*?)\//g, ""));
}