【请教】多行匹配的问题
时间:2010-10-19
来源:互联网
有如下一段文本:
<!-- PilotMessageSettings -->
<PilotMessageSettings>
<PilotMessage>
<add key="EventMessage"><![CDATA[
<!--Please note that ... <a href="#"><old ></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";
}
输出总是不对
<!-- PilotMessageSettings -->
<PilotMessageSettings>
<PilotMessage>
<add key="EventMessage"><![CDATA[
<!--Please note that ... <a href="#"><old ></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 编辑
复制代码
输出为
复制代码
很粗糙,但是能用,多行匹配应该用 m 而不是 s 的
- my $content = join '', <DATA>;
-
- while($content =~ /(<[^>]*>)[^<]*<!\[CDATA/gm) {
- say $1;
- }
-
- __DATA__
- <!-- PilotMessageSettings -->
- <PilotMessageSettings>
- <PilotMessage>
- <add key="EventMessage"><![CDATA[
- <!--Please note that ... <a href="#"><old ></a>.-->
- ]]></add>
- <add key="PortfolioMessage">
- <![CDATA[
- Please note that....
- ]]></add>
- <add key="PortfolioAlertMessage">
- <![CDATA[
- Please note that ...
- ]]></add>
- <add key="EventMessage">
- <add key="PortfolioMessage">
- <add key="PortfolioAlertMessage">
作者: zhlong8 发布时间: 2010-10-19
回复 zhlong8
太感谢了,原来是用m,不是s
没太看懂你的正则,能讲讲啥意思吗?谢谢
太感谢了,原来是用m,不是s
没太看懂你的正则,能讲讲啥意思吗?谢谢
作者: ununique007 发布时间: 2010-10-19
本帖最后由 zhlong8 于 2010-10-20 00:06 编辑
复制代码
解释下来更好的一个RE应该是
复制代码
- /
- (<[^>]*>) #捕获 <>和中间的内容,注意中间的内容是不能有 > 字符的。你的 (<.*?>)其实更好
- [^<]* #skip所有不是 < 的字符,包括换行。这里按你的需求也可以用 \s*
- <!\[CDATA #匹配 <














