zhanglintc
V2EX  ›  问与答

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

  •  
  •   zhanglintc · Jan 19, 2017 · 2856 views
    This topic created in 3405 days ago, the information mentioned may be changed or developed.
    之前一直知道, 正则表达式中被小括号比如 (exp) 括起来的部分, 可以按顺序使用 \1, \2 引用到.

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

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