Вопрос

Как я могу установить порядок сопоставления элементов в регулярном выражении PCRE?

У меня есть динамическое регулярное выражение, которое может предоставить пользователь, и которое используется для извлечения двух значений из строки и сохранения их в двух строках.Однако бывают случаи, когда два значения могут находиться в строке в обратном порядке, поэтому первое (\w+) или что-то еще необходимо сохранить во второй строке.

Это было полезно?

Решение

вы можете извлечь строки по имени, используя

(?<name>\w+)

и получить значения с помощью

pcre_get_named_substring

Другие советы

Если вы сопоставляете обе части с одним и тем же подшаблоном (например, \w+), не повезло тебе.Но если подшаблоны заметно отличаются, у вас есть несколько вариантов, и ни один из них не очень красив.Вот регулярное выражение, которое использует условную конструкцию, соответствующую src и type атрибуты элемента HTML-скрипта в любом порядке:

\b(?(?=src=)
  src="([^"]*)"\s+type="([^"]*)"|
  type="([^"]*)"\s+src="([^"]*)"
)

(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:Это регулярное выражение делает множество нереалистичных предположений, главным из которых является то, что оба атрибута будут присутствовать и что они будут соседствовать друг с другом.Я использую его только для иллюстрации техники.)

Если src атрибут появляется первым, src и type значения будут зафиксированы в первой и второй группах соответственно.В противном случае они появятся в четвертой и третьей группах соответственно.Именованные группы облегчили бы отслеживание событий, особенно если бы можно было использовать одно и то же имя в разных местах, как в регулярных выражениях .NET.К сожалению, PCRE требует, чтобы каждая именованная группа имела уникальное имя, а это очень плохо;это очень хорошая особенность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top