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