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。所以对于这个题目而言,一种写法是这样:
^((?!(.)(.)\3\2).)+$ , 后跟的.括起来加上+表示若干个字符的累计,这样就确保串中不可以含有abba的形式。
也可以这样写^(?!.*(.)(.)\2\1) , 这样的话只可以知道True和False但并没有指示明确的匹配方案,所以匹配得到的串是空串,就是由于(?!pattern)不占位。
ps:如果不加^则会出错,因为可以把‘abba’中的'bba'看做合法串匹配成功。
regex-ways的更多相关文章
- Five Invaluable Techniques to Improve Regex Performance
Regular expressions are powerful, but with great power comes great responsibility. Because of the wa ...
- REGEX例子
作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...
- .net正则表达式大全(.net 的 System.Text.RegularExpressions.Regex.Match()方法使用)
正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET的System.dll类库提供的System.Text.RegularExpression ...
- [LeetCode] Different Ways to Add Parentheses 添加括号的不同方式
Given a string of numbers and operators, return all possible results from computing all the differen ...
- [LeetCode] Decode Ways 解码方法
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- Decode Ways
https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...
- C#正则表达式Regex常用匹配
使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...
- 字符串切分 String.Split 和 Regex.Split
当切割字符串的是单个字符时可使用String.Split string strSample="ProductID:20150215,Categroy:Food,Price:15.00&quo ...
- 【LeetCode】241. Different Ways to Add Parentheses
Different Ways to Add Parentheses Given a string of numbers and operators, return all possible resul ...
- [Leetcode] Decode Ways
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
随机推荐
- zabbix3.2使用自带模板监控MySql
一.zabbix自带MySql模板监控项 Zabbix3.0之后已经有MySql监控模板了,所以我们只要引用ZabbixServer自带的模板即可.zabbix默认有14个监控项 我们只需获取监控项需 ...
- ARGB与RGB、RGBA的区别
ARGB 是一种色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构. RGB 色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变 ...
- springboot中通过cors协议解决跨域问题
1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现. 针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨域问题我基本也是这么处 ...
- Windows平台分布式架构实践 - 负载均衡(转载)
Windows平台分布式架构实践 - 负载均衡 概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Li ...
- python框架之Flask(4)-上下文管理
知识储备 偏函数 作用 偏函数,帮助开发者自动传递参数. 使用 import functools def index(a1, a2): return a1 + a2 # 原来的调用方式 # ret = ...
- js之prototype 原型对象
原型对象prototype可以这么理解,是该类的实例对象的模板,每个实例对象都是先复制一份该类的prototype,通过这个可以让类的实例拥有相同的功能 String.prototype.say= ...
- block,inline和inline-block概念和区别(转载)
转自: http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-lev ...
- python 字节转换成图像
python 字节转换成图像 使用base64 1.图片转成字节使用: base64.b64encode() 2.字节转成图片: base64.b64decode() 图片字节串: iVBORw0K ...
- HTML5 元素属性介绍
HTMLElement 表示所有的 HTML 元素. 这里将以事件属性和非事件属性的分类进行介绍. 事件属性大多继承自GlobalEventHandlers,非事件属性大多继承自Element. 菜单 ...
- chm开源文档制作
作为开发人员,API文档是非常关键的^_^,但是很多时候官方提供的文档是html的docs,不方便于携带查询,本章主要介绍chm文档的制作方法. 使用jd2chm制作chm文档 安装之前必须先安装 h ...