JavaScript разбить строку по положительному взгляду - PullRequest
2 голосов
/ 24 июня 2019

Я пытаюсь разбить строку, включая разделители, поэтому, например,

  • "a/b/c" станет ["a/", "b/", "c"]
  • "a//b" станет ["a/", "/", "b"]

var s = "a/b/c".split(/(?<=\/)/);

console.log(s); // prints ["a/", "b/", "c"]

Он отлично работает в Chrome, но Firefox говорит: SyntaxError: invalid regexp group

Отсюда мои вопросы:

  1. код законный?
  2. Как заставить его работать в Firefox и Edge?

Ответы [ 3 ]

3 голосов
/ 24 июня 2019

Я не думаю, что Firefox пока поддерживает взгляды. Вместо этого можно разделить группу захвата, чтобы сохранить разделитель, сопоставить любые предшествующие символы, которые не являются косыми чертами внутри группы, а затем отфильтровать, чтобы удалить пустые строки. Например:

let s = 'a/b/c'.split(/([^/]*\/)/).filter(x => x);
console.log(s);
// ["a/", "b/", "c"]

let s = 'a//b'.split(/([^/]*\/)/).filter(x => x);
console.log(s);
// ["a/", "/", "b"]
1 голос
/ 24 июня 2019

(a) похоже, что большинство браузеров еще не поддерживают lookbehind;Chrome - один из немногих, кто делает (по состоянию на 2019-июнь) [источник: http://kangax.github.io/compat-table/es2016plus/#test-RegExp_Lookbehind_Assertions]

(b) Я хотел бы просто разделить на /\// и знать, что каждый элементно последний должен «действительно» иметь косую черту."a/b//c//".split(/\//) возвращает ["a","b","","c","",""].

(c) Вы также можете сделать косую черту match (а не split), за которой следует 0 или более без косых черт: "a/b//c//".match(/[^\/]*\//g) возвращает ["a/","b/","/","c/","/"].

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

0 голосов
/ 24 июня 2019

Я не знаю, почему эта штука не работает в остальных браузерах.Но вы можете использовать следующий трюк с replace:

var text = 'a/b/c';
var splitText = text
    .replace(new RegExp(/\//, 'g'), '/ ') // here you are replacing your leading slash `/` with slash + another symbol e.g. `/ `(space is added) 
    .split(' ') // to further split with added symbol as far as they are removed when splitting.
 console.log(splitText) // ["a/", "b/", "c"]

Таким образом, вы можете избежать использования этого сложного regExp, который не работает в FireFox, Edge и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...