V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
andybest
V2EX  ›  问与答

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

  •  
  •   andybest · 2014-12-04 02:53:46 +08:00 · 2378 次点击
    这是一个创建于 3661 天前的主题,其中的信息可能已经有所发展或是发生改变。
    <script>不可预知的代码aaa不可预知的代码</script>
    <script>不可预知的代码bbb不可预知的代码</script>

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

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

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

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

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

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

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

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

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

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

    会失效
    11
        7
    11  
       2014-12-04 04:21:01 +08:00   ❤️ 1
    (<script>)(?!</script>).+?bbb.+?(</script>)
    andybest
        8
    andybest  
    OP
       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
        9
    Sylv  
       2014-12-04 04:55:24 +08:00   ❤️ 1
    <script>((?!</script>).)+bbb((?!</script>).)+</script>
    如果是包含换行的情况,其它语言不清楚,Python 的正则表达中需要加 re.DOTALL 和 re.MULTILINE 的 flags
    11
        10
    11  
       2014-12-04 04:58:54 +08:00   ❤️ 1
    @andybest 同 @Sylv ,你需要 multiline
    vivid
        11
    vivid  
       2014-12-04 07:15:02 +08:00
    s=find('<script>')
    e=find('</script>')
    content[s,e].find('bbb')

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

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

    那么现在问题就来了:“死循环卫士”哪里可以下载到?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:57 · PVG 12:57 · LAX 20:57 · JFK 23:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.