Как я могу получить слова между последовательными токенами через регулярное выражение? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь разобрать :hello::world: и захватить hello и world по отдельности.К сожалению, следующие результаты в этом:

const str = ':hello::world:'
const matches = str.match(/\:[^\s]+\:/g)
console.log(matches) // [':hello::world:']

Ответы [ 3 ]

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

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

/(?<=:)([^:]+)(?=:)/g

Он ищет любой текст без двоеточия, которому предшествует, а затем следуетдвоеточие.Таким образом, вы можете изменить «str» на «start: hello :: brave new world: end», и он все еще соответствует вашему правилу в том смысле, что «start» и «end» исключены, потому что у них нет двоеточий с обеих сторон,и «дивный новый мир» появляется как единое целое.

const str = 'start:hello::brave new world:end';
const matches = str.match(/(?<=:)([^:]+)(?=:)/g);
console.log(matches); // ["hello", "brave new world"]

Как указывает @Mohammad, lookbehind (первая часть в скобках) - это новая функция.Таким образом, вы можете настроить мой подход к:

const str = 'start:hello::brave new world:end'
const matches = str.match(/:([^:]+)(?=:)/g).map(s => s.slice(1));
console.log(matches);
0 голосов
/ 14 декабря 2018

Вы используете регулярное выражение :[^\s]+:, совпадающее с :, и затем использует отрицательный символьный класс, чтобы сопоставить не пробельный символ.Это будет соответствовать до конца вашего примера строки.

Затем он снова будет соответствовать :, который является последним : в строке, что приведет к :hello::world:

Что вы можете сделать, это использовать группу захвата и сопоставить недвоеточие ([^:]+) между двоеточиями и в результате получается первая группа захвата.Обратите внимание, что вам не нужно избегать двоеточия:

:([^:]+):

Regex demo

const regex = /:([^:]+):/g;
const str = `:hello::world:`;
let m;

while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log(m[1]);
}
0 голосов
/ 14 декабря 2018

Ваше регулярное выражение соответствует любой строке, кроме пробела, который вызывает совпадение всей строки.Поэтому вам нужно сопоставить любую строку, кроме :

const str = ':hello::world:'
const matches = str.match(/[^:]+/g);
console.log(matches); 

Обратите внимание, что вы можете выполнять эту работу без регулярных выражений.Просто разделите строку на : разделитель и удалите пустые элементы, используя .filter()

const str = ':hello::world:'
const matches = str.split(':').filter(v=>v!='');
console.log(matches) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...