2013-08-05 2 views
0

Используя замкнутое регулярное выражение, я могу совместить извлечение значения 'model_name', когда nfc_support "value =" true в нескольких экземплярах. Однако я не могу заставить его сопоставлять другие экземпляры, как показано ниже. Любая помощь в том, чтобы он соответствовал в обоих случаях, был бы весьма признателен.Regex - Многострочное извлечение

EX:

<capability name=\"model_name\"[A-Za-z1-9"=();,._/<>\s]*<capability name=\"nfc_support\"   value=\"true\"/> 

будет работать с:

<capability name="model_name" value="T11"/> 
<capability name="brand_name" value="Turkcell"/> 
<capability name="marketing_name" value="Campaign"/> 
</group> 
<group id="chips"> 
<capability name="nfc_support" value="true"/> 
</group> 

Но не может сравниться с этим:

<capability name="model_name" value="U8650"/> 
<capability name="brand_name" value="Huawei"/> 
<capability name="marketing_name" value="Sonic"/> 
</group> 
<group id="chips"> 
<capability name="nfc_support" value="true"/> 
+0

Возможный дубликат [теги OpenEx Open, за исключением тегов XHTML с автономными тегами] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-containedtags) –

+0

Что именно вы пытаетесь сопоставить? – JDiPierro

ответ

0

Прости меня, если я ошибаюсь, но это похоже на ваше выражение от:

[A-Za-z1-9 "= (), ._/<> \ s]

не учитывает в 0 в классе символов (показывая, как 1-9), и, таким образом, должно быть:

[A-Za-z0-9" =();, ._/<> \ s]

EDIT: Это в отношении вашего примера неигрового для значения "MODEL_NAME" = "U8650"

2

вашего регулярное выражение будет соответствовать все между первым именем model_name и последним nfc_support = true, поскольку вы используете квантификатор жадного *. Это проблема, если у вас есть несколько вхождений nfc_support в ту же строку, к которой вы применяете регулярное выражение, так как оно будет продолжать поиск, пока не найдет<capability name = "nfc_support" value = "true"/>. Лучшая практика для выборочного соответствия текста, который может появляться несколько раз, заключается в том, чтобы использовать отрицательный квантор : *?, чтобы избежать совпадения.

Предполагая, что все линии будут следовать формату MODEL_NAME, BRAND_NAME, marketing_name,/группы, идентификатор группы, то nfc_support, регулярное выражение, которое навязывает этот формат является:

(?s)<capability name=\"model name\" value=\"(.*?)\"/>\n<capability name=\"brand_name\" value=\"(.*?)\"/>\n<capability name=\"marketing_name\" value=\"(.*?)\"/>\n</group>\n<group_id=\"chips\">\n<capability name=\"nfc_support\" value=\"true\"/>

Извиняюсь заранее, если есть опечатки в этом регулярном выражении, но вы получите его суть ...

Это регулярное выражение будет хранить значения model_name, brand_name и marketing_name в группах $ 1, $ 2 и $ 3 соответственно, только если nfc_support является "true. " (?s) обеспечивает многострочный поиск.

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