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。所以对于这个题目而言,一种写法是这样:

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

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

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

regex-ways的更多相关文章

  1. Five Invaluable Techniques to Improve Regex Performance

    Regular expressions are powerful, but with great power comes great responsibility. Because of the wa ...

  2. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...

  3. .net正则表达式大全(.net 的 System.Text.RegularExpressions.Regex.Match()方法使用)

    正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET的System.dll类库提供的System.Text.RegularExpression ...

  4. [LeetCode] Different Ways to Add Parentheses 添加括号的不同方式

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  5. [LeetCode] Decode Ways 解码方法

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  6. Decode Ways

    https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...

  7. C#正则表达式Regex常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...

  8. 字符串切分 String.Split 和 Regex.Split

    当切割字符串的是单个字符时可使用String.Split string strSample="ProductID:20150215,Categroy:Food,Price:15.00&quo ...

  9. 【LeetCode】241. Different Ways to Add Parentheses

    Different Ways to Add Parentheses Given a string of numbers and operators, return all possible resul ...

  10. [Leetcode] Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

随机推荐

  1. jdbc--取大量数据

    最近使用jdbc方式查询数据,保存为csv文件中.当然你可以在pl/sql中直接查出来,copy to excel就好了.但我想通过程序实现 @Test public void test() thro ...

  2. java框架之SpringBoot(10)-启动流程及自定义starter

    启动流程 直接从 SpringBoot 程序入口的 run 方法看起: public static ConfigurableApplicationContext run(Object source, ...

  3. 【UML】NO.55.EBook.8.UML.3.001-【UML和模式应用 第3版】

    1.0.0 Summary Tittle:[UML]NO.54.EBook.8.UML.3.001-[UML和模式应用 第3版] Style:DesignPattern Series:DesignPa ...

  4. ignore_user_abort(true); set_time_limit(0);程序在本地测试可以一直运行,上传服务器只能运行10-15分钟

    当PHP运行在安全模式下时此函数无效.除了关闭安全模式或者在php.ini程序中修改最大运行时间没有其他办法让此函数运行. php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中 ...

  5. Linux平台 Oracle 18c RAC安装Part1:准备工作

    一.实施前期准备工作 1.1 服务器安装操作系统 1.2 Oracle安装介质 1.3 共享存储规划 1.4 网络规范分配 二.安装前期准备工作 2.1 各节点系统时间校对 2.2 各节点关闭防火墙和 ...

  6. 《linux就该这么学》第三节课 第二节命令笔记

    命令笔记 (随笔原创,借鉴请修改) linux系统中一切都是文件 2.4  系统状态的命令:  ifconfig   :    查看系统网卡信息,包括网卡名称,ip地址,掩码,mac地址,收到数据包大 ...

  7. Python记录11:叠加多个装饰器+有参装饰器

    # import time## def timmer(func): #func=最原始的index的内存地址# def wrapper(*args,**kwargs):# start=time.tim ...

  8. Jmeter对jar包的调用赋值

    一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...

  9. Maven setting.xml文件详解(转)

    maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.home}/.m2/setting ...

  10. bzoj2880

    打公式好麻烦 QAQ 为了节省时间去复习,原谅我引用一下别人的博客...http://blog.csdn.net/acdreamers/article/details/8542292 #include ...