正则求助,如何匹配每个 HTML 标签?

2014-12-04 02:53:46 +08:00
 andybest
<script>不可预知的代码aaa不可预知的代码</script>
<script>不可预知的代码bbb不可预知的代码</script>

需要仅匹配包含 bbb 关键字的 script 标签,使用:

<script>.+?bbb.+?</script>

发现总是匹配了所有内容,如何破?
2388 次点击
所在节点    问与答
16 条回复
yfdyh000
2014-12-04 03:18:11 +08:00
(<script>).+?bbb.+?(</script>)
这样吗。
andybest
2014-12-04 03:37:53 +08:00
@yfdyh000 这样是从头开始匹配到尾了
yfdyh000
2014-12-04 03:46:33 +08:00
不清楚你想要哪部分。正则表达式 后向引用 分组
http://deerchao.net/tutorials/regex/regex.htm#backreference
Sylv
2014-12-04 03:48:45 +08:00
(<script>)[^<]+?bbb[^<]+?(</script>)
andybest
2014-12-04 04:03:34 +08:00
@Sylv 谢谢!但是还有个问题,如果内容为:

<script>不可预知的代码aaa不可预知的代码</script>
<script>var k='<';不可预知的代码bbb不可预知的代码</script>

这个匹配规则就失效了,我尝试将匹配规则改为:

(<script>)[^</script>]+?bbb[^</script>]+?(</script>)

但不生效 ^ 只能排除单一字符码?
andybest
2014-12-04 04:06:25 +08:00
@yfdyh000 我需要匹配

<script>不可预知的代码bbb不可预知的代码</script>

这部分内容,如果是反向引用内容为:

<script>不可预知的代码aaa不可预知的代码</script>
<script>不可预知的代码bbb不可预知的代码</script>
<script>不可预知的代码ccc不可预知的代码</script>

会失效
11
2014-12-04 04:21:01 +08:00
(<script>)(?!</script>).+?bbb.+?(</script>)
andybest
2014-12-04 04:30:07 +08:00
@11 谢谢!但实际应用中标签内容中包含换行:

<script>不可预知的代码aaa不可预知的代码</script>
<script>var k='<';
不可预知的代码bbb不可预知的代码</script>

这样匹配就失效了,我尝试改为

(<script>)(?!</script>)[\s\S]+?bbb.+?(</script>)

用 [\s\S] 替换 . 来包含其中的换行,但不生效,如何破?
Sylv
2014-12-04 04:55:24 +08:00
<script>((?!</script>).)+bbb((?!</script>).)+</script>
如果是包含换行的情况,其它语言不清楚,Python 的正则表达中需要加 re.DOTALL 和 re.MULTILINE 的 flags
11
2014-12-04 04:58:54 +08:00
@andybest 同 @Sylv ,你需要 multiline
vivid
2014-12-04 07:15:02 +08:00
s=find('<script>')
e=find('</script>')
content[s,e].find('bbb')

over
rrfeng
2014-12-04 10:29:19 +08:00
遇到这种问题我都会建议使用 DOM 解析 模块……
imn1
2014-12-04 10:46:14 +08:00
以你说的感觉很奇芭,1.默认非贪婪?2.圆点默认支持换行?
sohoer
2014-12-04 11:35:09 +08:00
楼主是用JAVA的吧!
JAVA对正则支持不太好,做嵌套匹配得想点办法
sohoer
2014-12-04 11:46:01 +08:00
script不考虑嵌套可以试下这个

.*<script>(.*?bbb.*?)</script>.*
abscon
2014-12-04 21:21:44 +08:00
搭车问能回答出楼主这个问题的高手另一个问题:
我写的程序有时候会有bug,一运行就进死循环,界面没有响应,还得费劲杀死进程。为了避免浪费时间,我想安装一个“死循环卫士”,在程序运行前自动检测这个程序,如果发现会进死循环就阻止它运行,并弹出一个对话框提示:死循环卫士检测到该程序会进入死循环,需要继续运行吗?

那么现在问题就来了:“死循环卫士”哪里可以下载到?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/151363

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX