zoukankan      html  css  js  c++  java
  • regex-ways

      regex的分组与捕获:分组就是用小括号(str)括起来的东西,就是一个分组。要想得到这些分组的信息,就要想办法捕获。每个分组都有编号,编号规则是从外向内,从左至右。

      

    。例如,在表达式 (A)(B(C)) 中,存在四个这样的组:

    0   

    (A)(B(C))

    1   

    (A)

    2   

    (B(C))

    3   

    (C)

     

    0表示所有的分组。

      与之相关的一种神奇的操作就是back反向引用,字面意思就是引用某个分组的内容(注意是内容而不是正则表达式)。x表示引用了第x个分组。

      有的时候我们并不是想得到所有的分组,这时候就要用到非捕获组:

      以(?)开头的组是纯的非捕获组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。

      非捕获组有几个模式:

    • (?:pattern),他表示的就是pattern这个分组只匹配但不予捕获,例如,想要匹配different和difficult,我们可以diff(?:rent|icult),这样的好处在于不必保存后缀而占用空间。
    • (?=X),零宽度正向预查,他表示仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如:

      'Windows (?=95|98|NT|2000)'

      匹配 "Windows2000" 中的 "Windows"

      不匹配 "Windows3.1" 中的 "Windows"

    • (?!X),零宽度负向预查,他表示仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如:

      'Windows (?!95|98|NT|2000)'

      匹配 "Windows3.1" 中的 "Windows"

      不匹配 "Windows2000" 中的 "Windows"

    • (?<=X),零宽度正向回查,他表示仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如:

      '(?<=Office|Word|Excel)2000 '

      匹配 " Office2000" 中的 "2000"

      不匹配 "Windows2000" 中的 "2000"。

    • (?<!X),零宽度负向回查,他表示仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如:

      '(?<!Office|Word|Excel)2000'

      匹配 " Windows2000" 中的 "2000"

      不匹配 "Office2000" 中的 "2000"。

      注意以上所说X的位置就是这个表达式所在的位置,例如hello(?=pattern),那么这个(?=pattern)的位置就是字符'o'后面的那个空位。所以对于预查操作放在表达式右边比较好,回查放在左边比较好。举例来说来说就是 : .*2019(?<=hello)永远不会匹配上,因为以2019结尾的串自然不会等于hello。

      

      如果我们想匹配的是不含某个特定形式的子串,只依靠[^...]是不够的,这里就可以使用断言(?!pattern)。拿一个题目举例,regex golf-Abba,如果串中不含abba形式的子串则匹配成功,否则视为失败。

      (?!pattern)含义就是不包含pattern形式的串,它是不占位置的,起到一种指示作用,(?!hello)就是不包含hello。所以对于这个题目而言,一种写法是这样: 

    ^((?!(.)(.)32).)+$  ,  后跟的.括起来加上+表示若干个字符的累计,这样就确保串中不可以含有abba的形式。

      也可以这样写^(?!.*(.)(.)21) , 这样的话只可以知道True和False但并没有指示明确的匹配方案,所以匹配得到的串是空串,就是由于(?!pattern)不占位。

      ps:如果不加^则会出错,因为可以把‘abba’中的'bba'看做合法串匹配成功。

  • 相关阅读:
    Cisco静态路由
    VTP
    trunk
    vim中文乱码
    Ubuntu 切换root用户是时出现su Authentication failure
    github 换行符自动转换功能
    Qt弹出消息对话框
    串口发送Hex数组
    Qt 按顺序保存多个文件
    Qt乱码解决办法(常量中有换行符)
  • 原文地址:https://www.cnblogs.com/zzqc/p/10219830.html
Copyright © 2011-2022 走看看