Заменить все косые черты в строке соответствием в начале той же строки - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь изменить все косые черты в строке, чтобы заменить их 3-символьным блоком в начале каждой строки.(PMC, PAJ и т. Д. В приведенном ниже примере)

. PMC .89569XX / 90051XX / 90204XX / 89533XX / 90554XX / 90053XX / 90215XX / 89874XX / 89974XX / 90481XX / 90221XX / 90201XX/88526XX/89843XX/88041XX/90446XX/88515XX/89574XX/89847XX/88616XX/90513XX/90015XX/90334XX/89649XX.T00
. PAJ P.799XX+22266XX / 22714XX / 22658XX / 22631XX / 22288XX / 22020XX / 22735XX / 22269XX / 22138XX / 22331XX / 22387XX / 22070XX / 22636XX / 22629XX / 22487XX / 22487XX / 22 * ​​25 * 101 * 101 * 101 * желаемый* PMC.89569XXPMC90051XXPMC90204XXPMC89533XXPMC90554XXPMC90053XXPMC90215XXPMC89874XXPMC89974XXPMC90481XXPMC90221XXPMC90508XXPMC90183XXPMC88526XXPMC89843XXPMC88041XXPMC90446XXPMC88515XXPMC89574XXPMC89847XXPMC88616XXPMC90513XXPMC90015XXPMC90334XXPMC89649XX.T00

1017 * Я не знаю, как это сделать.Это то, что я до сих пор:
 (.)([A-Z]{3})(.)(\/)

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Если вы планируете поддерживать ECMAScript 2018 и новее, вы можете достичь того, что вам нужно, с помощью одного регулярного выражения:

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

См. Демонстрационную версию regex .

* 1007.* Подробности
  • (?<=^\.([^.]+)\..*?) - положительный взгляд, который, непосредственно слева от текущего местоположения, требует
    • ^ - начало строки
    • \. - точка
    • ([^.]+) - Группа 1: один или несколько символов, отличных от точки
    • \. - точка
    • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \/ - символ /.

JS demo:

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"));
}
0 голосов
/ 23 декабря 2018

Я не уверен, что вы можете сделать это с помощью одного регулярного выражения, и вам, вероятно, придется сделать это в два этапа.Сначала вы можете захватить три заглавные буквы, используя метод 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], затем все слэши заменяются этим захваченным словом, а затем, наконец, первый символ, который является точкой, удаляется с помощью этого /^./,'' и, наконец, возвращает нужную вам строку.

Дайте мне знать, если это то, что вы хотели.В противном случае, дайте мне знать, если вы хотите этого каким-либо другим способом.

...