2015-09-30 7 views
1

Учитывая примерную строку ниже, я пытаюсь захватить поля 'to', 'from', 'subject' и 'type' и выплевывать их обратно в другом формате. Проблема в том, что эти поля (от, от и т. Д.) Могут быть в любом порядке.regex соответствует нескольким группам захвата в любом порядке

ОБРАЗЦА STRING К REGEX НА

<cfmail to="#toAddr#" from="#fromAddress" 
    subject="#subject#" type="html"> 
    #emailMsg# 
</cfmail> 

ВЫХОДА Я ИЩУ

to:toAddr, from:fromAddress, subject:subject 

Если бы я знал, что порядок этих местах я заинтересован в всегда была такой же, то это довольно легко, но я в тупике о том, как это сделать, если, например, «от» доходит до «

Перлайтер с одним слоем, который у меня есть прямо сейчас (просто тестирование с 'to' и ' субъект ')

s/<cfmail.*?((to)="(.*?)")|((subject)="(.*?)").*<\/cfmail>/\1:\2, \3:\4/g 

Это заканчивается тем, что соответствует значению 'to', но останавливается там, и я не получаю ничего для значения «subject». Я попробовал несколько вариантов этого, когда я меняю настройку группы и т. Д., Но мне не повезло.

+0

Почему вы не используете надлежащую библиотеку анализа XML? – lenz

+0

Если вы должны сделать это с помощью регулярного выражения (ну, вы используете Perl ...), сделайте это в два этапа: сначала запишите подстроку ''. Затем сделайте 's /// g' альтернативы, как в вашем однострочном, но не соответствующие окружающим тэгам XML. – lenz

+0

спасибо Ленц. Я думаю, что ваше предложение разбить его на шаги - это путь. – Josh

ответ

1

Нужно ли разрешать отсутствующие поля (например, поле type)? Как насчет других полей в дополнение к этим четырем? Если вы ответили не на оба вопроса, это регулярное выражение должно сделать трюк:

s!<cfmail(?:\s+to="(?<to>[^"]+)"|\s+from="(?<from>[^"]+)"|\s+subject="(?<subject>[^"]+)"|\s+type="(?<type>[^"]+)")+>.*?</cfmail>!to:$+{to}, from:$+{from}, subject:$+{subject}!gs 

Вот регулярное выражение один в более читаемом виде:

<cfmail 
(?: 
    \s+to="(?<to>[^"]+)" 
    | 
    \s+from="(?<from>[^"]+)" 
    | 
    \s+subject="(?<subject>[^"]+)" 
    | 
    \s+type="(?<type>[^"]+)" 
)+ 
> 
.*?</cfmail> 

... и DEMO

Вы были довольно близки; чередование было ключевым. Вам просто нужно было добавить квантификатор.

Обратите внимание, что я удалил группы захвата из имен полей. Вы уже знаете имена, вам просто нужно соединить их с правильными значениями. Названные группы делают это намного проще.

 Смежные вопросы

  • Нет связанных вопросов^_^