使用正则表达式不匹配字符串中的字符串

时间:2013-02-11 21:38:15

标签: regex

我有一个像这样的XML文件:

<xml:head>
    <xml:reportObject>
        <xml:device>
            <device:id>
                <id:value = value />
            </device:id>
            <device:OpAttributes>
                <OpAttributes:value = value />
            <device:OpAttributes>
            <device:Config>
                <Config:NetConfig>
                    <NetIF:ID = value />
                    <NetHost>
                        <NetHost:MAC = value />
                    </NetHost>
                </Config:NetConfig>
            </device:Config>
            <device:Role = value />
            <device:TaggedString name="value" value="value" />
            <device:Addition junk ........ />
        </xml:device>
    </xml:reportObject>
    Lather, Rinse, Repeat for several instances on reportObjects
</xml:head>

我的问题是我正在尝试解析三个值(特别是“NetHost:MAC”,“device:Role”和“device:TaggedString”值)以转储到数据库列中的位置。

我们使用的程序是一个内部工具,它将基于RegEx匹配执行此操作,但由于XML在“xml:device”标记之后变平,我仍在寻找一种方法来匹配每个“xml” :device“标签继续进一步解析...踢球者是我只能在”device:Role“标签是客户端的情况下继续解析。还有其他东西给了太多垃圾和我的解析炸弹。

我最有效的尝试(以及随后的失败)是这样的:

<xml:device([\s\S]+?(\b\w*Client\w*\b))</xml:device>

这适用于我的90%的比赛,但在文件的某个地方,[\ s \ S] +?由于缺乏较早的匹配,并且仍在制作我的解析炸弹,所以匹配得太远了。

任何帮助都会让我不再拉我的头发。

RegEx是我目前通过内部工具进行解析的唯一选择。如果你能想到不同的东西,请告诉我。

1 个答案:

答案 0 :(得分:2)

尝试使用正则表达式时,不要拉扯你的头发(女孩不喜欢秃头程序员),试试NSXMLParser类(nicely documented by Apple)。设置此任务会容易得多。