Соответствующий порядок в PCRE - PullRequest
0 голосов
/ 02 июня 2009

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

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

Ответы [ 2 ]

3 голосов
/ 02 июня 2009

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

(?<name>\w+)

и получите значения с

pcre_get_named_substring
1 голос
/ 02 июня 2009

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

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

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

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

...