我想匹配并捕获所有现有的(如果有)
块和其中一个的内部 html 文档内的
块。
我以为这很简单,但我遇到了一些奇怪的事情。
这是我对整个正则表达式的猜测:
/(<style[\s\S]+<\/style>)*[\s\S]*<body.*>([\s\S]+)<\/body>/i
它什么结果也没有。所以我把它拆开了,这些部分工作了:
/(<body.*>([\s\S]+)<\/body>)/i
/(<style[\s\S]+<\/style>)/i
最奇怪的是第一行也工作了,而第二个结果是空的!
/(<style[\s\S]+<\/style>)+/i
/(<style[\s\S]+<\/style>)*/i
所以,我猜错误是子模式之后 * 和 + 之间的差异。为什么?我该如何解决这个问题?
谢谢!!
I want to match and catch all existing (if any) <style...</style>
blocks and the inside of one <body..</body>
block inside a html document.
I thought this was simple, but I bump against something weird.
This was my guess for the whole regex:
/(<style[\s\S]+<\/style>)*[\s\S]*<body.*>([\s\S]+)<\/body>/i
It results into nothing. So i broke it apart and these parts work:
/(<body.*>([\s\S]+)<\/body>)/i
/(<style[\s\S]+<\/style>)/i
And weirdest of all this first line works too, while the second results empty!
/(<style[\s\S]+<\/style>)+/i
/(<style[\s\S]+<\/style>)*/i
So, I guess the error is the difference between * and + after the subpattern. Why? And how do I solve this?
Thanks!!
发布评论
评论(1)
您遇到了四个问题:
第一和第二,您使用正则表达式来解析 HTML。
第三,你匹配太多:你至少需要让一些量词变得懒惰,即使用
.*?
,[\s\S]*?
等.,或者您的正则表达式将匹配所有内容,直到行或文件的末尾,然后仅回溯必要的数量以找到最后一个可能的匹配标记。第四,通过在重复组中设置重复组,您已经为灾难性的回溯做好了准备,这两个组都有无数种方法来匹配相同的文本。
据我了解您的问题,您希望匹配从第一个