andybest
V2EX  ›  问与答

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

  •  
  •   andybest · Dec 4, 2014 · 2957 views
    This topic created in 4185 days ago, the information mentioned may be changed or developed.
    <script>不可预知的代码aaa不可预知的代码</script>
    <script>不可预知的代码bbb不可预知的代码</script>

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

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

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

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

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

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

    但不生效 ^ 只能排除单一字符码?
    andybest
        6
    andybest  
    OP
       Dec 4, 2014
    @yfdyh000 我需要匹配

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

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

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

    会失效
    11
        7
    11  
       Dec 4, 2014   ❤️ 1
    (<script>)(?!</script>).+?bbb.+?(</script>)
    andybest
        8
    andybest  
    OP
       Dec 4, 2014
    @11 谢谢!但实际应用中标签内容中包含换行:

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

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

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

    用 [\s\S] 替换 . 来包含其中的换行,但不生效,如何破?
    Sylv
        9
    Sylv  
       Dec 4, 2014   ❤️ 1
    <script>((?!</script>).)+bbb((?!</script>).)+</script>
    如果是包含换行的情况,其它语言不清楚,Python 的正则表达中需要加 re.DOTALL 和 re.MULTILINE 的 flags
    11
        10
    11  
       Dec 4, 2014   ❤️ 1
    @andybest 同 @Sylv ,你需要 multiline
    vivid
        11
    vivid  
       Dec 4, 2014
    s=find('<script>')
    e=find('</script>')
    content[s,e].find('bbb')

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

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

    那么现在问题就来了:“死循环卫士”哪里可以下载到?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5599 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 02:02 · PVG 10:02 · LAX 19:02 · JFK 22:02
    ♥ Do have faith in what you're doing.