我想匹配'script'标记(如果其中包含'bb'
,它可以是'bb'
和'script'
标记之间的任何内容,包括换行符,所以我使用{{1} }?
以下是我正在处理的文字:
[\s\S]*
模式为:<script>
aa
</script>
<script>
bb
</script>
<script>
cc
</script>
但这也将<script>[\s\S]*?bb[\s\S]*?<\/script>
标记与里面的'script'
匹配,我尝试了很多次但没有工作,然后如何匹配仅内部'aa'
的脚本标记?
答案 0 :(得分:0)
只需使用<script>\s+bb\s+<\/script>
说明:
<script>
-从字面上匹配<script>
\ s + bb \ s + - match one or more white spaces with
\ s + , match
bb literally, again match one or more white spaces with
\ s +`
<\/script>
-从字面上匹配</script>
您使用[\s\S]
,它匹配每个字符:\s
-匹配任何空格,\S
-匹配除空格之外的所有字符。这就是您的模式不起作用的原因。
答案 1 :(得分:0)
使用正则表达式解析HTML不是一个好主意,因为当您的脚本标签嵌套时,它可能会给您带来意想不到的结果。
但是,以防万一您的标签没有嵌套,您可以使用此正则表达式,该正则表达式将仅匹配其中包含bb
的脚本标签,并且不会像现在那样跨越多个脚本标签。在您的正则表达式中,[\s\S]*?
匹配任何字符,因为它也匹配从第一个<script>
标签开始的连续<script>
标签,该标签跨越多个<script>
标签覆盖{{1} }。
bb
此正则表达式与您的正则表达式几乎相同,唯一不同的是,我将<script>(?:(?!<script>)[\s\S])*?bb(?:(?!<script>)[\s\S])*?<\/script>
部分更改为[\s\S]*?
,此正则表达式不允许捕获多个(?:(?!<script>)[\s\S])*?
标签一次匹配,因此一次仅匹配一个脚本标签。
让我知道这是否对您有用。