Рекурсивный захват идентификатора с помощью RegExp - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь найти следующую строку:

 something, something, something, something, something shouldignore

Желаемый результат будет: [something, something, something, something, something]. Я придумал этот RegExp (^[\t ]+[^,\s]+), но он не работает для других 4 something.

Демо .

Ответы [ 2 ]

0 голосов
/ 12 января 2019

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

Вы можете использовать свое регулярное выражение и добавить (?:,\1)* в конец, чтобы повторить то, что вы уже захватили, используя обратную ссылку. Вы также можете убрать якорь ^ из группы и поставить его в начале.

^([\t ]+[^,\s]+)(?:,\1)*

Regex demo

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

const str = " something, something, something, something, something shouldignore";

let res = str.match(/^([\t ]+[^,\s]+)(?:,\1)*/)[0]
    .split(',')
    .map(x => x.trim());

console.log(res);

Если после shouldignore может возникнуть еще один something, вы можете разбить на необязательную запятую, за которой следуют 1+ пробельные символы ,?\s+, и отфильтровать те, которые не совпадают с первым элементом в возвращенном массиве. из сплита:

const str = " something, something, something, something, something shouldignore something";

let res = str.trim()
    .split(/,?\s+/)
    .filter((x, _, a) => x === a[0]);
console.log(res);
0 голосов
/ 12 января 2019

Вы можете использовать обратные ссылки для этого, хотя я не уверен, зачем вам это нужно (RE не всегда лучшее решение!):

^[\t ]+([^,\s]+)(, \1)*

Здесь \1 соответствует любой захваченной группе № 1.

Онлайн на RegExr .

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