比如针要从下方 html 里提取出 你好:
<div>你好</div>
(?<=<div>).*(?=<\/div>)
<div>(.*)<\/div>
我感觉明显方案 2 更简单,那么 断言存在的价值是什么? 是不是有什么特殊的应用场景?
谢谢
1
eason1874 2021 年 10 月 2 日
第一种会记住匹配结果的位置 index,第二种没有
处理字符串,有时候位置很重要。不过我写正则都很短,没写过太复杂的,具体场景不了解 |
2
ch2 2021 年 10 月 2 日
是不是有什么特殊的应用场景?
使用断言的匹配结果是不含<div>的,你不需要额外从结果里把<div>去掉 |
3
shadows 2021 年 10 月 2 日 方案一只会匹配到“你好”
方案而二匹配结果是“<div>你好</div>” 这就是区别啊 |
4
weakish 2021 年 10 月 2 日 因为这个场景太简单了。
比如,把「你好」替换成「您好」,然后外面包围的不一定是 div 可能是 span 、p 等等标签,那用断言可以直接匹配到,最后的替换字符串就是「您好」。不用断言,就需要三个 group,替换字符串类似 `$1 您好$3`。如果条件更复杂,group 数会爆炸,还会出现 group 嵌套 group,可读性就更差。 再比如校验密码复杂性,最少最多几个字符,同时包含大小写字母数字特殊符号等等,用断言写就比较方便。 |
6
passerbytiny 2021 年 10 月 3 日 via Android
第二种提取出来的是 “<div>你好</div>” ,并不是要求的 “你好”,这种行为对应一个典型的名词:跑题。
|
7
autoxbc 2021 年 10 月 3 日
第二种取结果时需要用数组下标,第一种不需要,核心问题是:正则作为一种嵌入式语言,是不是提供了足够的抽象能力,以及,这种抽象能力是不是对宿主语言无依赖
|
8
wdssmq 2021 年 10 月 3 日 oBody = oBody.replace(/<(?!((\/?\s?blockquote)|(\/?\s?ol)|(\/?\s?ul)|(\/?\s?li)|(\/?\s?img)|(\/?\s?br)|(\/?\s?hr)|(\/?\s?table)|(\/?\s?tr)|(\/?\s?th)|(\/?\s?td)|(\/?\s?p)))[^>]+>/g,"");
|
9
alanhe421 2021 年 10 月 3 日
....断言是为了解决位置,本身不匹配任何内容
|