【请教】多行匹配的问题
时间: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 #匹配 <![CDTA
- /gmx
- /(<.*?>)\s*<!\[CDATA/gm
作者: zhlong8 发布时间: 2010-10-19
回复 zhlong8
多谢zhlong8,受教了
晚安了哦~~~~
多谢zhlong8,受教了
晚安了哦~~~~
作者: ununique007 发布时间: 2010-10-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28