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' - ... 
随机推荐
- Vue2.0 v-for 中 :key 到底有什么用?
			要解释 key 的作用,不得不先介绍一下虚拟 DOM 的 Diff 算法了. vue 和 react 的虚拟 DOM 的Diff算法大致相同,其核心是基于两个简单的假设: 1.两个相同的组件产生类似的 ... 
- 为什么分布式数据库中不使用uuid作为主键?
			分布式数据库当然也有主键的需求,但是为什么不直接使用uuid作为主键呢?作为曾经被这个问题困惑过的人,试着回答一下 1. UUID生成速率低下 Java的UUID依赖于SecureRandom.nex ... 
- mac安装gcc
			xcode-select --install安装命令行工具 安装完毕后,可能报错 xcrun: error: active developer path ("/Applications/Xc ... 
- Mysql数据库配置参数详解大全
			名称 是否需要重启 值 允许值 描述 auto_increment_increment 否 1 1-65,535 auto_increment_increment和auto_increment_off ... 
- PHP中new self()和new static()的区别探究
			1.new static()是在PHP5.3版本中引入的新特性. 2.无论是new static()还是new self(),都是new了一个新的对象. 3.这两个方法new出来的对象有什么区别呢,说 ... 
- web状态管理机制
			引入:b/s(浏览器/服务器模式)区别于winform的是winform中只加载一次页面构造函数,而b/s中只要点击按钮或者其他涉及后台的操作都会调用后台代码.一般情况下为了防止服务器过载,b/s不会 ... 
- Python Scrapy爬虫速成指南
			序 本文主要内容:以最短的时间写一个最简单的爬虫,可以抓取论坛的帖子标题和帖子内容. 本文受众:没写过爬虫的萌新. 入门 0.准备工作 需要准备的东西: Python.scrapy.一个IDE或者随便 ... 
- WAR包方式安装Jenkins
			WAR包方式安装Jenkins 系统环境: CentOS 7.5 1804 IP:192.168.1.3 关闭selinux.firewalld jenkins war包:下载地址 一.安装t ... 
- JSONModel(I)
			JSONModel使用简介 JSONModel 只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常 ... 
- python selenium基于显示等待封装的一些常用方法
			import os import time from PIL import Image from selenium import webdriver from appium import webdri ... 
