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' - ...
随机推荐
- 集合 & 深浅copy
集合: 特点:集合是可变的数据类型,但他里面的元素必须是不可变的数据类型,无序,不可重复. 创建: set1 = set({1,2,3}) 或者直接创建set2 = {1,2,3} 集合的增删查: 增 ...
- linux 防火墙 iptables 目录
linux iptables 防火墙简介 Linux 防火墙:Netfilter iptables 自动化部署iptables防火墙脚本
- ATM目录结构
作者:高江平版本:1.0程序介绍: 实现ATM常用功能程序结构:atm实现|——README|——atm #ATM主程序目录| |——bin #ATM执行文件目录| | |——__init__.py| ...
- Spring 部分常用注解
最近在Spring-MVC的项目,把一些自己在项目中使用到的注解整理一下. 1.@Controller 对应表现层的Bean,也就是Struts中对应的Action: 使用这个注解之后,就是把当前Be ...
- java之搭建webservice服务端
1.新建工程. 2.配置项目名称和位置. 3.得到的项目结构如下: 4.配置tomcat服务器. (1) (2)新建一个tomcat服务. (3)配置tomcat参数. 5.配置WSDL文件. url ...
- HTTPS学习笔记一----HTTPS的基础理论知识
首先推荐一本书,<HTTP权威指南>我就是看这本书入门的,对http协议有了更好的理解,学习https的理论知识我认为需要了解以下几点,需要一步步的深入学习: 1.HTTPS的基本概念? ...
- Java 解析Excel(xls、xlsx两种格式)
Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...
- 基础的基于QT的图像查看程序
代码来自<QT5.9c++开发指南>,因为实现了图片的遍历显示,对于将来编写ImageShop一类的图像程序来说将非常有用(这个程序目前存在一定问题,在研究过程中进行解决) 一.基本功能 ...
- Bugku-CTF之flag在index里
Day15 flag在index里 http://123.206.87.240:8005/post/
- UVA1401 Remember the Word
思路 用trie树优化dp 设f[i]表示到第i个的方案数,则有\(f[i]=\sum_{x}f[i+len[x]]\)(x是s[i,n]的一个前缀),所以需要快速找出所有前缀,用Trie树即可 代码 ...