Учитывая это:

{
 author={Diaz, Navarro David and Gines, Rodriguez Noe},
 year={2006},
 month=jul # "~12",
 note={EP Patent 1,678,025}
}

Я хотел бы сопоставить и захватить различные группы имен в поле автора, разделенных "и" (в этом случае: Диас, Наварро Дэвид и Джинс, Родригес Но), их может быть более 2

Пока что regex с использованием положительного lookbehind захватывает все в керли, если ему предшествует 'author = {' но я изо всех сил пытаюсь захватить 2 группы, которые удовлетворяют условию выше. Помогите! :)

(?<=author=\{)([^}]+)

1
Fabrice 15 Авг 2019 в 10:15

2 ответа

Лучший ответ

Наилучший подход - взять подстроку между author={ и } и разделить значение группы 1 целым словом and:

var str = '{\n author={Diaz, Navarro David and Gines, Rodriguez Noe and Another, John Doe},\n year={2006},\n month=jul # "~12",\n note={EP Patent 1,678,025}\n}';
var m = /author={([^{}]*)}/.exec(str);
if (m) {
 console.log(m[1].trim().split(/\s*\band\b\s*/));
}

Если вам нужно сделать это с помощью одного регулярного выражения, вы должны выбрать самый последний стандарт ECMAScript, который поддерживает объекты бесконечной ширины.

Следующий код будет работать в текущей версии Chrome:

var str = '{\n author={Diaz, Navarro David and Gines, Rodriguez Noe and Another, John Doe},\n year={2006},\n month=jul # "~12",\n note={EP Patent 1,678,025}\n}';
var rx = /(?<=author={[^{}]*?)(?<![^{\s])(?:(?!\band\b)[^{}])+\b(?<!\s)/g;
console.log(str.match(rx));

См. демонстрационную версию regex

Подробности

  • (?<=author={[^{}]*?) - положительный взгляд за спиной, который возвращает true, если непосредственно слева от текущего местоположения есть подстрока author={, за которой следуют любые 0+ символов, кроме { и } как можно меньше
  • (?<![^{\s]) - также сопоставлять только следующие шаблоны, если непосредственно слева от текущего местоположения нет другого символа, кроме пробела или { (обрезает совпадение слева)
  • (?:(?!\band\b)[^{}])+ - любой символ, кроме { и }, 1 или более вхождений, который не начинается с целого слова and
  • (?<!\s) - отрицательный вид сзади, который возвращает true, если непосредственно слева от текущего местоположения нет пробелов (обрезает совпадение справа).
1
Wiktor Stribiżew 15 Авг 2019 в 17:08

Чтобы соответствовать всей части, вы можете повторить класс символов:

Если между ними {{X 0}}, вы можете использовать 2 группы захвата:

(?<=author={)([^}]*) and ([^}]*)

Regex demo

Обратите внимание, что lookbehinds еще не полностью поддерживаются во всех браузерах в Javascript.

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

\bauthor={([^}]+) and ([^}]+)},

Regex demo

1
The fourth bird 15 Авг 2019 в 07:21