Соедините строку с тем же разделителем, который использовался для разделения - PullRequest
3 голосов
/ 09 января 2020

У меня есть строка, которую нужно разделить регулярным выражением для применения некоторых модификаций.

например:

const str = "Hello+Beautiful#World";
const splited = str.split(/[\+#]/)

// ["Hello", "Beautiful", "World"]

Теперь строка была разделена с помощью + или #. Теперь, скажем, после применения некоторой модификации к элементам в массиве, я должен присоединиться к массиву, используя тот же разделитель, что и для разделения, поэтому символы + и # должны быть в той же позиции, что и раньше.

Например: если я применил некоторую строку модификации и присоединился. Тогда это должно быть.

Hello001+Beutiful002#World003

Как я могу это сделать?

Ответы [ 5 ]

2 голосов
/ 09 января 2020

Когда вы помещаете шаблон в группу захвата, split возвращает совпавшие разделители как четные элементы массива. Итак, все, что вам нужно сделать, это изменить нечетные элементы:

var counter=1;
var str = "Hello+Beautiful#World";
console.log(
  str.split(/([+#])/).map(function(el, index){
    return el + (index % 2 === 0 ? (counter++ + "").padStart(3, '0') : '');
  }).join("")
);
2 голосов
/ 09 января 2020

Не используйте split и join в этом случае. Используйте String.replace() и верните измененные строки:

const str = "Hello+Beautiful#World";

let counter = 1;
const result = str.replace(/[^\+#]+/g, m =>
  `${m.trim()}${String(counter++).padStart(3, '0')}`
);

console.log(result);

Другой вариант, который может не подходить для всех случаев, - это разделение перед специальными символами с помощью заглядывания, сопоставление элементов и объединение с пустой строкой:

const str = "Hello+Beautiful#World";

let counter = 1;
const result = str.split(/(?=[+#])/)
  .map(s => `${s.trim()}${String(counter++).padStart(3, '0')}`)
  .join('')

console.log(result);
1 голос
/ 09 января 2020

Мое решение состоит в том, чтобы получить сплиттеры, а затем сохранить их в массив и воссоединиться:

function splitAndRejoin(){
    const str = "Hello+Beautiful#World";
    const splited = str.split(/[\+#]/);
    var spliterCharacter = [];
    for(var i = 0; i < str.length; i++){
        if(str[i] == "+" || str[i] == "#"){
            spliterCharacter.push(str[i]);
        }
    }
    var rejoin = "";
    for (i = 0; i <= spliterCharacter.length; i++) {
        if(i< spliterCharacter.length)
            rejoin += splited[i] + spliterCharacter[i];
        else
            rejoin += splited[i];
    }
    console.log(splited);
    console.log(spliterCharacter);
    console.log(rejoin); // Result
}
1 голос
/ 09 января 2020

Вы можете получить пропущенные подстроки, повторив разделенное значение и проверив детали.

var string = "Hello++#+Beautiful#World",
    splitted = string.split(/[\+#]+/),
    start = 0,
    symbols = splitted.map((s, i, { [i + 1]: next }) => {
        var index = string.indexOf(next, start += s.length);
        if (index !== -1) {
            var sub = string.slice(start, index);
            start = index;
            return sub;
        }
        return '';
    });

console.log(symbols);
console.log(splitted.map((s, i) => s + symbols[i]).join(''));
0 голосов
/ 09 января 2020

вы можете присоединиться к массиву, найдя индексы, где совпадение произошло в строке

const str = "Hello+Beautiful#World";
const regex = /[\+#]/g;
const splited = str.split(regex);
console.log(splited);


//join
let x = '';
let i=0;
while ((match = regex.exec(str)) != null) {
    x = x + splited[i] + "00" + (i+1) + str[match.index];
    i++;
}
x = x + splited[splited.length-1] + "00" + (i+1);
console.log(x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...