Совпадение с чем угодно, кроме под-паттерна - PullRequest
2 голосов
/ 11 марта 2010

Я бы хотел выполнить то, что пытается сделать это (я считаю, недействительным) регулярное выражение:

<p><a>([^(<\/a>)]+?)<\/a></p>uniquestring

По сути, сопоставьте все, кроме закрывающего тега привязки. Простой не жадный здесь не поможет, потому что «uniquestring» вполне может быть после другого удаленного закрывающего тега привязки:

<p><a>text I don't <tag>want</tag> to match</a></p>random 
data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more
matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 

Так что у меня есть больше тегов между тегами привязки. И я использую присутствие uniquestring, чтобы определить, хочу ли я сопоставить данные. Таким образом, простой не жадный в конечном итоге сопоставляет все от начала данных, которые я не хочу, до конца данных, которые я хочу.

Я знаю, что приближаюсь к проблемам, которые регулярные выражения (или, по крайней мере, мои знания о них) плохо решают. Я мог бы просто просмотреть данные в парсере HTML / XML, но это всего лишь один простой (ish) поиск.

Есть ли какой-нибудь простой способ сделать это, что я просто скучаю?

1 Ответ

1 голос
/ 11 марта 2010

Вы ищете отрицательный взгляд нулевой ширины:

<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring

Тест:

(zyx:~) % echo $T
<p><a>text I don't <tag>want</tag> to match</a></p>random  data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring
(zyx:~) % echo $T | grep -oP '<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring'
<p><a>text I do <tag>want to</tag> match</a></p>uniquestring
<p><a>of <tag>text I do</tag> want to match</a></p>uniquestring
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...