正则表达式 里的 断言,是不是没啥用?

2021-10-02 21:54:44 +08:00
 find456789

比如针要从下方 html 里提取出 你好:

<div>你好</div>

方案 1:用 断言

(?<=<div>).*(?=<\/div>)

方案 2:用普通正则

<div>(.*)<\/div>

我感觉明显方案 2 更简单,那么 断言存在的价值是什么? 是不是有什么特殊的应用场景?

谢谢

1763 次点击
所在节点    问与答
9 条回复
eason1874
2021-10-02 22:33:44 +08:00
第一种会记住匹配结果的位置 index,第二种没有

处理字符串,有时候位置很重要。不过我写正则都很短,没写过太复杂的,具体场景不了解
ch2
2021-10-02 22:42:48 +08:00
是不是有什么特殊的应用场景?
使用断言的匹配结果是不含<div>的,你不需要额外从结果里把<div>去掉
shadows
2021-10-02 22:52:33 +08:00
方案一只会匹配到“你好”
方案而二匹配结果是“<div>你好</div>”
这就是区别啊
weakish
2021-10-02 23:00:00 +08:00
因为这个场景太简单了。

比如,把「你好」替换成「您好」,然后外面包围的不一定是 div 可能是 span 、p 等等标签,那用断言可以直接匹配到,最后的替换字符串就是「您好」。不用断言,就需要三个 group,替换字符串类似 `$1 您好$3`。如果条件更复杂,group 数会爆炸,还会出现 group 嵌套 group,可读性就更差。

再比如校验密码复杂性,最少最多几个字符,同时包含大小写字母数字特殊符号等等,用断言写就比较方便。
ipwx
2021-10-02 23:24:07 +08:00
@weakish group 套 group 可以用不捕获的 group 搞定。

其实断言更有用的是,不得不回溯做一点事情的时候。。。
passerbytiny
2021-10-03 08:07:11 +08:00
第二种提取出来的是 “<div>你好</div>” ,并不是要求的 “你好”,这种行为对应一个典型的名词:跑题。
autoxbc
2021-10-03 09:11:41 +08:00
第二种取结果时需要用数组下标,第一种不需要,核心问题是:正则作为一种嵌入式语言,是不是提供了足够的抽象能力,以及,这种抽象能力是不是对宿主语言无依赖
wdssmq
2021-10-03 12:15:52 +08:00
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,"");
alanhe421
2021-10-03 14:37:49 +08:00
....断言是为了解决位置,本身不匹配任何内容

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX