正则表达式 - 多行提取

时间:2013-08-05 18:52:57

标签: regex

使用随附的正则表达式,我可以匹配在nfc_support“value =”true时在几个实例中提取'model_name'值。但是,我无法让它匹配其他实例,如下所示。在这两个实例中获得匹配的任何帮助都将非常感激。

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"/>

2 个答案:

答案 0 :(得分:2)

您的正则表达式将匹配第一个model_name和最后一个nfc_support = true之间的所有内容,因为您使用了贪婪的*量词。如果您在应用正则表达式的同一个字符串中出现多次nfc_support,则会出现问题,因为它会继续搜索,直到找到 <capability name = "nfc_support" value = "true"/>。选择性地匹配可能多次出现的文本的更好做法是使用不情愿的贪婪量词:*?,以避免匹配过多。

假设所有行都将遵循model_name,brand_name,marketing_name,/ group,group id,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\"/>

如果这个正则表达式中存在拼写错误,请提前道歉,但你得到了它的要点......

只有当nfc_support为“true”时,此正则表达式才会将model_name,brand_name和marketing_name的值分别存储到$ 1,$ 2和$ 3组中。 (?s)启用多行搜索。

答案 1 :(得分:0)

如果我错了,请原谅我,但看起来像你的表达:

[A-ZA-z1-9" =(); ._ /&LT;&GT; \ S]

不会在你的角色类中占0(显示为1-9),因此应该是:

[A-ZA-Z0-9" =(); ._ /&LT;&GT; \ S]

编辑:这是关于您对“model_name”值=“U8650”不匹配的示例