Учитывая это:
{
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=\{)([^}]+)
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, если непосредственно слева от текущего местоположения нет пробелов (обрезает совпадение справа).
Чтобы соответствовать всей части, вы можете повторить класс символов:
Если между ними {{X 0}}, вы можете использовать 2 группы захвата:
(?<=author={)([^}]*) and ([^}]*)
Обратите внимание, что lookbehinds еще не полностью поддерживаются во всех браузерах в Javascript.
Другой вариант - сопоставить деталь вместо использования обходных путей:
\bauthor={([^}]+) and ([^}]+)},
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.