正则表达式匹配XML中的属性

时间:2016-03-08 09:57:49

标签: regex notepad++

请帮帮我。我需要查找包含<field id="0" value="0200"/><field id="24" value="001"/>的所有日志。我使用这个正则表达式<log.+?<field id="0" value="0200"/>.+?<field id="24" value="001"/>.+?</log>使用Notepad ++,但效果不佳。

<log>
  <receive>
    <isomsg direction="incoming">
      <header>6008610000</header>
      <field id="0" value="0200"/>
      <field id="3" value="440000"/>
      <field id="11" value="000001"/>
      <field id="24" value="001"/>
      <field id="41" value="12345678"/>
      <field id="42" value="0000012345678"/>
    </isomsg>
  </receive>
</log>
<log>
  <receive>
    <isomsg direction="incoming">
      <header>6008610000</header>
      <field id="0" value="0300"/>
      <field id="3" value="440000"/>
      <field id="11" value="000002"/>
      <field id="24" value="002"/>
      <field id="41" value="12345678"/>
      <field id="42" value="0000012345678"/>
    </isomsg>
  </receive>
</log>
<log>
  <receive>
    <isomsg direction="incoming">
      <header>6008610000</header>
      <field id="0" value="0200"/>
      <field id="3" value="440000"/>
      <field id="11" value="000002"/>
      <field id="24" value="001"/>
      <field id="41" value="12345678"/>
      <field id="42" value="0000012345678"/>
    </isomsg>
  </receive>
</log>
<log>
  <receive>
    <isomsg direction="incoming">
      <header>6008610000</header>
      <field id="0" value="0200"/>
      <field id="3" value="440000"/>
      <field id="11" value="000002"/>
      <field id="24" value="004"/>
      <field id="41" value="12345678"/>
      <field id="42" value="0000012345678"/>
    </isomsg>
  </receive>
</log>

2 个答案:

答案 0 :(得分:0)

首先,您应该为此目的使用一些XML解析器。

如果你真的想用正则表达式做这件事,你需要注意:

  • .+通配符与新行字符不匹配。请改为[\s\S]+
  • 可接受的字段可能以随机顺序出现,
  • 您的正则表达式不应与多个<log></log>块匹配。

编辑:

如果正则表达式是唯一的选项,并且您只想查找所提到的字段的所有出现,那么您可以尝试一些丑陋的正则表达式,例如

((<field id="0" value="0200".*)\s*((<field.*)*\s*)*?(<field id="24" value="001".*))+?|((<field id="24" value="001".*)\s*((<field.*)*\s*)*?(<field id="0" value="0200".*))+?`

表示:匹配以<field id="0" value="0200"开头的文字,而不只有<field.*行,以<field id="24" value="001".*结尾或以<field id="24" value="001".*等开头。

答案 1 :(得分:0)

Notepad ++不支持多行正则表达式。