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

时间:2018-12-23 15:44:00

标签: javascript regex regexp-replace regexp-substr

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

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 / 22387XX / 22070XX / 22636XX / 22629XX / 22487XX / 22725XX.T00

期望的结果应该是:

PMC.89569XXPMC90051XXPMC90204XXPMC89533XXPMC90554XXPMC90053XXPMC90215XXPMC89874XXPMC89974XXPMC90481XXPMC90221XXPMC90508XXPMC90183XXPMC88526XXPMC89843XXPMC90PM90PMPMC90PMPMC90PMXXPMC90PMXXPPMC89PMC90PMXXCPM90089CPMXXCPM1CPM1CPM1CPM1CPM1CPM1CPM3C

我不确定该如何完成。 这是我到目前为止的内容:

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

2 个答案:

答案 0 :(得分:5)

如果仅计划支持ECMAScript 2018和更高版本,则可以使用一个正则表达式来实现所需的功能:

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

请参见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, "$1"));
}

答案 1 :(得分:1)

我不确定您是否可以仅使用一个正则表达式来完成它,您可能必须将其作为一个两步过程来完成。首先,可以使用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");
}

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

让我知道这是否对您有用。

编辑:

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

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]提取三个大写字母,然后使用捕获的单词替换所有斜杠,然后使用此/^./,''删除第一个点(点),最后返回所需的字符串。 / p>

让我知道这是否是您想要的。否则,请让我知道您是否进一步想要任何特定的方式。