RegEx захватывает несколько повторяющихся необязательных полей?

Довольно новичок в RegEx, полегче со мной. Мне было интересно, можете ли вы захватить несколько повторяющихся необязательных полей? Например, этот URL имеет несколько полей мета-значения RELATED. Но у некоторых URL есть только одна мета, у других — 3+. Приведенное ниже регулярное выражение необязательно будет захватывать только первое мета-значение.

Моему источнику теперь нужно захватить менее 4 метаданных, поэтому я могу просто вставить повторяющееся: (((?!meta-value).)+meta-value">([^<]+))? в RegEx, чтобы захватить первые четыре.

Тем не менее, мне было интересно, есть ли лучший способ. Я рассматривал возможность захвата метаданных в отдельном регулярном выражении, но они связаны с URL-адресом, поэтому я пытался захватить их одновременно.

Пример регулярного выражения:

<a href="([^"]+)(((?!meta-value).)+meta-value">([^<]+))?

Пример текста (первый URL-адрес имеет две категории мета-значений, второй URL-адрес имеет только одну):

bla bla <a href="testurl.html"> bla bla <div id="meta-value">Category</div> bla bla bla <div id="meta-value">Diff Category</div> bla bla <a href="testurl2.html"> thsdlkjfh <div id="meta-value">Category2</div> bla bla bla 

http://www.regexpal.com/?fam=97173

Спасибо за помощь.


person PsuFan    schedule 15.03.2017    source источник
comment
Какой ожидаемый результат от примера строки   -  person ManishChristian    schedule 15.03.2017
comment
Для захвата testurl.html и всех связанных с ним мета-значений. И да, код работает, вопрос в том, нужно ли мне повторять (((?!мета-значение).)+мета-значение›([^‹]+))? снова и снова, чтобы зафиксировать все мета-значения, или есть ли способ захватить их все без бессмысленного копирования/вставки.   -  person PsuFan    schedule 15.03.2017


Ответы (1)


Я не уверен, что полностью понимаю желаемый результат, но если вы ищете содержимое каждого элемента div в каждом теге <a>, я бы предложил два совпадения.

Первый должен получить все теги <a> и их содержимое: <a href="(.+?)".*?<\/a> с группой захвата для URL-адреса, если хотите.

Затем просмотрите список <a> тегов, которые вы только что создали, и используйте это выражение для извлечения мета-частей: <div id="meta-value">(.*?)<\/div>

Вы можете поиграть с этими выражениями здесь.

Если это не соответствует ожидаемому результату, пожалуйста, уточните.

person jjspace    schedule 15.03.2017
comment
Да, мне пришлось (в VB6 использовать (NextMatch).FirstIndex - FirstIndex + Length to) получить подстроку между совпадениями ‹a› и запустить sub RegEx, чтобы найти все мета-значения. Спасибо - person PsuFan; 16.03.2017