正则表达式中 ?: 的使用场景是什么啊?

2017-01-19 22:56:02 +08:00
 zhanglintc
之前一直知道, 正则表达式中被小括号比如 (exp) 括起来的部分, 可以按顺序使用 \1, \2 引用到.

现在才知道, 如果在小括号中最前面加上 ?: 变成比如(?:exp), 那么这个小括号中的内容将不会占用 \1 这样的位置.

那么我就有点想不到使用了小括号括起来, 却不想去反向引用它的使用场景在哪里? 有人可以举个例子吗?
2281 次点击
所在节点    问与答
8 条回复
veelog
2017-01-19 23:02:14 +08:00
比如(?:a|b|c|)
veelog
2017-01-19 23:02:36 +08:00
比如(?:a|b|c|d)
veelog
2017-01-19 23:03:25 +08:00
比如(?:a111|b222|c333)
zhanglintc
2017-01-19 23:09:30 +08:00
@veelog 我, 好像有点明白了. 这还顺便解决了我之前不知道怎么写正则或的疑问...
xuchkang171
2017-01-20 00:05:03 +08:00
场景一例:正则式很长,多次用到括号,但并非所有使用括号的部分都是你希望最终提取出来的信息,很多括号的内容只是为了使匹配成功而不得不用,这时候用 ?: 可以将这些只想匹配不想最终提取出来的括号从结果中去掉,以使结果中只有你关注的信息。
Biwood
2017-01-20 00:34:02 +08:00
(x) 和 (?:x) 的基础功能是用来分组匹配,前者会分配组号,后者没有。所以(?:exp)的作用有两点:
1. 节约性能,毕竟分配组号会耗费 CPU 资源。
2. 不参与组号分配,因为组号分配是按照从左往右的顺序分配的,也许中间某些组并不需要被分配组号,那就可以用(?:x)。
zhanglintc
2017-01-20 09:43:47 +08:00
@xuchkang171 "很多括号的内容只是为了使匹配成功而不得不用", 怎么会有这种情况呢? 不用括号就匹配不到吗? 是不是主要就是楼上提到的那种写"或"的情况?
irenicus
2017-01-20 11:38:29 +08:00
@zhanglintc 对的,就是你想的这样。括号一般就两个用途,“或”以及“捕获”,不做捕获用的那就只是做或了

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

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

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

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

© 2021 V2EX