+ -
当前位置:首页 → 问答吧 → 【请教】多行匹配的问题

【请教】多行匹配的问题

时间:2010-10-19

来源:互联网

有如下一段文本:

  <!-- PilotMessageSettings -->
  <PilotMessageSettings>
    <PilotMessage>
      <add key="EventMessage"><![CDATA[
      <!--Please note that ... <a href="#">&lt;old &gt;</a>.-->
      ]]></add>
      <add key="PortfolioMessage">
      <![CDATA[
              Please note that....
          ]]></add>
      <add key="PortfolioAlertMessage">
      <![CDATA[
          Please note that ...
            ]]></add>

希望把CDATA前面<>的内容找出来,得到如下的内容,
<add key="EventMessage">
<add key="PortfolioMessage">

该怎么写呢?试了好久都没成功, 我这样写的:

my $content = join '', <DATA>;
while($content=~/ (\<.*?\>) \Q<![CDATA[\E .*? \Q]]>\E /gxs){
        print "************$1\n";
}
输出总是不对

作者: ununique007   发布时间: 2010-10-19

本帖最后由 zhlong8 于 2010-10-19 23:00 编辑
  1. my $content = join '', <DATA>;

  2. while($content =~ /(<[^>]*>)[^<]*<!\[CDATA/gm) {
  3.     say $1;
  4. }

  5. __DATA__
  6. <!-- PilotMessageSettings -->
  7. <PilotMessageSettings>
  8.    <PilotMessage>
  9.      <add key="EventMessage"><![CDATA[
  10.      <!--Please note that ... <a href="#">&lt;old &gt;</a>.-->
  11.      ]]></add>
  12.      <add key="PortfolioMessage">
  13.      <![CDATA[
  14.              Please note that....
  15.          ]]></add>
  16.      <add key="PortfolioAlertMessage">
  17.      <![CDATA[
  18.          Please note that ...
  19.            ]]></add>
复制代码
输出为
  1. <add key="EventMessage">
  2. <add key="PortfolioMessage">
  3. <add key="PortfolioAlertMessage">
复制代码
很粗糙,但是能用,多行匹配应该用 m 而不是 s 的

作者: zhlong8   发布时间: 2010-10-19

回复 zhlong8


    太感谢了,原来是用m,不是s
    没太看懂你的正则,能讲讲啥意思吗?谢谢

作者: ununique007   发布时间: 2010-10-19

本帖最后由 zhlong8 于 2010-10-20 00:06 编辑
  1. /
  2. (<[^>]*>)  #捕获 <>和中间的内容,注意中间的内容是不能有 > 字符的。你的 (<.*?>)其实更好
  3. [^<]*      #skip所有不是 < 的字符,包括换行。这里按你的需求也可以用 \s*
  4. <!\[CDATA  #匹配 <![CDTA
  5. /gmx
复制代码
解释下来更好的一个RE应该是
  1. /(<.*?>)\s*<!\[CDATA/gm
复制代码

作者: zhlong8   发布时间: 2010-10-19

回复 zhlong8

多谢zhlong8,受教了
晚安了哦~~~~

作者: ununique007   发布时间: 2010-10-20