首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配HTML标记的正则表达式问题

匹配HTML标记的正则表达式问题
EN

Stack Overflow用户
提问于 2012-03-17 04:42:15
回答 2查看 2.1K关注 0票数 1

所以我尝试使用sed (在这些系统上它必须是sed的,所以请不要只推荐使用Perl)来匹配HTML标记并从中获取内容。HTML标记看起来像这样:

代码语言:javascript
复制
<div class="SectionText"> Received poor service or think your current mechanic is ripping you off? Get some help from <a href="http://www.union.umd.edu/gradlegalaid/index.htm" target="_blank">Graduate Legal Aid</a> or consult the <a href="http://www.oag.state.md.us/Consumer/index.htm" target="_blank">Maryland Attorney General Office of Consumer Protection</a> at <a href="mailto:consumer@oag.state.md.us">consumer@oag.state.md.us</a> or through their hotline at 410-528-8662 or 888-743-0023.<br /></div>

这一切都在一条线上。所以,我写了这个...但它不起作用。

代码语言:javascript
复制
sed 's/<div class=\"SectionText\">\([^<\/div>]*\)<\/div>/\1/g'

这不会改变任何文本。

我试着使用这个网站作为一个指南- http://www.ibm.com/developerworks/linux/library/l-sed2/index.html (在RegExp混乱之下)\

最重要的是,这行脚本不要贪婪,要匹配到最后一行

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-17 05:01:15

代码语言:javascript
复制
[^<\/div>]*

这并不是你所想的那样。它匹配不是</div>的任何字符序列。

在Perl中,您可以简单地使用.*?,但由于sed不支持非贪婪匹配,因此您必须编写类似下面这样的代码:

代码语言:javascript
复制
sed 's#<div class="SectionText">\(\([^<]\|<[^/]\|</[^d]\|</d[^i]\|</di[^v]\|</div[^>]\)*\)</div>#\1#g'

这表示“任何字符序列不是<,或者是<而不是/,或者是</而不是d,依此类推。

不用说,这是一个不可读、不可维护、几乎不可写的垃圾,您几乎肯定不应该使用它,但是如果您绝对、肯定地必须使用正则表达式来解析HTML,并且绝对、肯定地必须使用sed,那么就可以使用它了。

票数 2
EN

Stack Overflow用户

发布于 2012-03-17 04:48:07

除了尝试在html上使用正则表达式(参见RegEx match open tags except XHTML self-contained tags)之外,我看到的第一个问题是:

[^<\/div>]*

这意味着匹配任何不是</div>字符。很明显,你有一个d和一个i。("Rece i ve d poor Server....“)

如果您打算使用正则表达式来执行此操作,并且您有一个控制/可预测的输入,那么您可以简单地执行[^<>],假设您的文本中不包含这些字符。但是,我知道你有,因为你在你的div里面有标签…

但是,如果您这样做:

sed 's/<div.class="SectionText">\(.*\)<\/div>/\1/g'

只要你没有多个</div>,它就应该可以工作。.*只有在找到<\/div>之前才会匹配。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9744246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档