Использование группы захвата в функции.split()

У меня есть строка, и я хочу разбить ее на массив, используя '|' символ, но не '\|':

var a = 'abc\&|\|cba';
var b = a.split(/([^\\])\|/);

результат:

b = ["abc", "&", "|cba"]

ожидаемый результат:

b = ["abc\&", "\|cba"]

По сути, я не могу правильно использовать группы захвата в функции.split().

3 ответа

Решение

Вы можете использовать позитивный взгляд на расщепление.

С обратной косой чертой

var a = 'abc\\&|\\|cba';
var b = a.split(/\|(?=\\)/);
console.log(b);

Без экранированной обратной косой черты

/\|(?=\|)/

  • \| соответствует персонажу | в прямом смысле

  • (?=\|) Позитивный взгляд - утверждают, что приведенное ниже регулярное выражение может быть сопоставлено

    • \| соответствует персонажу | в прямом смысле

По сути, он ищет трубу и разбивается, если другая труба следует.

var a = 'abc\&|\|cba';
var b = a.split(/\|(?=\|)/);
console.log(b);

Вы можете сделать это следующим образом, используя выражения регулярных выражений, сохраняя каждое идентифицированное слово (в данном случае цену) в массиве, а затем захватывая его при необходимости.

var re = /(?:^|[ ])|([a-zA-Z]+)/gm;
var str = 'abc\&|\|cba';
var identifiedWords;

while ((identifiedWords = re.exec(str)) != null) 
{
    if (identifiedWords.index === re.lastIndex) 
    {
        re.lastIndex++;
    }
// View your result using the "identifiedWords" variable.
// eg identifiedWords[0] = abc\&
// identifiedWords[1] = cba

}

Я полагаю, у вас есть буквальный \ в ваших строках, и что ваш вопрос содержит опечатку во входном строковом литерале. В строках JS C необходимо использовать двойной \ определить обратную косую черту литерала (поскольку в обычных строковых литералах вы можете определить escape-последовательности, такие как \r, \n, так далее).

Ваше регулярное выражение должно соответствовать всем символам, кроме \ а также | или любой буквальный \ сопровождается любым письмом. Если ваша строка может быть равна литералу \, тебе нужно

var a = 'abc\\&|\\|cba';
b = a.match(/(?:[^\\|]|\\.?)+/g);
console.log(b);

Шаблон соответствует:

  • (?: - (начало группы перехвата без захвата)
    • [^\\|] - любой символ, кроме \ а также |
    • | - или же
    • \\.? - а \ с последующими 1 или 0 символами, кроме новой строки
  • )+ - 1 или более раз
Другие вопросы по тегам