V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhanglintc
V2EX  ›  问与答

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

  •  
  •   zhanglintc · 2017-01-19 22:56:02 +08:00 · 2394 次点击
    这是一个创建于 2868 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前一直知道, 正则表达式中被小括号比如 (exp) 括起来的部分, 可以按顺序使用 \1, \2 引用到.

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

    那么我就有点想不到使用了小括号括起来, 却不想去反向引用它的使用场景在哪里? 有人可以举个例子吗?
    8 条回复    2017-01-20 11:38:29 +08:00
    veelog
        1
    veelog  
       2017-01-19 23:02:14 +08:00 via Android
    比如(?:a|b|c|)
    veelog
        2
    veelog  
       2017-01-19 23:02:36 +08:00 via Android
    比如(?:a|b|c|d)
    veelog
        3
    veelog  
       2017-01-19 23:03:25 +08:00 via Android   ❤️ 1
    比如(?:a111|b222|c333)
    zhanglintc
        4
    zhanglintc  
    OP
       2017-01-19 23:09:30 +08:00
    @veelog 我, 好像有点明白了. 这还顺便解决了我之前不知道怎么写正则或的疑问...
    xuchkang171
        5
    xuchkang171  
       2017-01-20 00:05:03 +08:00   ❤️ 1
    场景一例:正则式很长,多次用到括号,但并非所有使用括号的部分都是你希望最终提取出来的信息,很多括号的内容只是为了使匹配成功而不得不用,这时候用 ?: 可以将这些只想匹配不想最终提取出来的括号从结果中去掉,以使结果中只有你关注的信息。
    Biwood
        6
    Biwood  
       2017-01-20 00:34:02 +08:00   ❤️ 1
    (x) 和 (?:x) 的基础功能是用来分组匹配,前者会分配组号,后者没有。所以(?:exp)的作用有两点:
    1. 节约性能,毕竟分配组号会耗费 CPU 资源。
    2. 不参与组号分配,因为组号分配是按照从左往右的顺序分配的,也许中间某些组并不需要被分配组号,那就可以用(?:x)。
    zhanglintc
        7
    zhanglintc  
    OP
       2017-01-20 09:43:47 +08:00
    @xuchkang171 "很多括号的内容只是为了使匹配成功而不得不用", 怎么会有这种情况呢? 不用括号就匹配不到吗? 是不是主要就是楼上提到的那种写"或"的情况?
    irenicus
        8
    irenicus  
       2017-01-20 11:38:29 +08:00   ❤️ 1
    @zhanglintc 对的,就是你想的这样。括号一般就两个用途,“或”以及“捕获”,不做捕获用的那就只是做或了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5248 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.