javascript регулярное выражение: сопоставить все после ::, но не> - PullRequest
0 голосов
/ 25 января 2020

Я создал это регулярное выражение: /[::].+[^\>]/g

Тест:

let str = "<foo::bar>"
let match = str.match(/[::].+[^\>]/g).join('')
console.log(match)

Ожидаемый ответ: bar

Фактический ответ: ::bar

Ответы приветствуются.

Ответы [ 3 ]

4 голосов
/ 25 января 2020

Один из вариантов - использовать утверждение просмотра за кадром ((?<=)), которое в настоящее время поддерживается только Chrome & Safari:

const str = "<foo::bar>"

const match = str.match(/(?<=::)[^\>]+/g).join('')

console.log(match)
1 голос
/ 25 января 2020

Другой вариант - использовать группу захвата вместо вида сзади:

::([^>]+)

Regex demo

Например

const regex = /::([^>]+)/g;
const str = `<foo::bar>`;
let m;
let match = [];

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  match.push(m[1]);
}
console.log(match.join(''));

Если вы хотите сопоставить весь шаблон строки, вы можете использовать:

<[^>]+::([^>]+)>

Regex demo

const regex = /<[^>]+::([^>]+)>/g;
const str = `<foo::bar>`;
let m;
let match = [];

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  match.push(m[1]);
}
console.log(match.join(''));
1 голос
/ 25 января 2020

Добавление дополнительного соответствия и объединение для удаления '::' решило проблему.

Рабочий код:

let str = "<foo::bar>"
let match = str.match(/[::].+[^\>]/g).join('')
            .match(/[^(::)].+/g).join()
console.log(match)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...