K:正则表达式之进阶
子表达式:
前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的。为此,使用了子表达式的概念。子表达式是一个更大的表达式的一部分,把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当作一个独立元素来进行使用。子表达式,用(和)括起来,其()中的内容表示一个整体。其中如果要匹配字符(和字符),则必须要对其进行转义,即使用\(和\)用于匹配字符“(”和字符“)”。
表达式(\d{1,3}\.){2}其等价于\d{1,3}\.\d{1,3}\.
子表达式运行进行嵌套,实际上,子表达式允许进行多重嵌套。这种嵌套层次在理论上并没有限制。
|用于表示选择,其将|前面的字符和|后面的字符都当成一个整体来进行对待。例如19|20,表示19和20两个部分中的其中之一,需要注意的是19|20\d{2}表示的是19和20\d{2}这两部分。如果需要用其来匹配19或者20开头的四位年份的话,需要将其写为(19|20)\d{2}的形式。如果要匹配|字符本身,需要对其进行转义,即“\|”用于匹配字符“|”本身
子表达式的用途之一回溯引用(backreference)
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式,回溯引用允许正则表达式模式引用前面匹配的结果。考虑一个问题,假如你有一段文本,你先把这段文本里所以连续重复出现的单词使用正则表达式来给其找出来。显然,在搜索某个单词的第二次出现时,这个单词必须是已知的,否则无法找出其重复的单词。
使用回溯引用的一个例子:
文本:this is a block of of text,several words here are are repeated,and and they should not be.
正则表达式:[ ]+(\w+)[ ]+\1
匹配结果:this is a block of of text,several words here are are repeated,and and they should not be.
解析:[ ]+用于匹配1到多个空格,\w+用于匹配一个或多个字母数字字符,[ ]+匹配随后的空格。需要注意的是\w+是一个子表达式,其并不涉及重复匹配的问题,这个子表达式只是把整个模式的一部分单独划分出来以便在后面进行引用。这个模式的最后一部分为\1,这是一个回溯引用,而它引用的正是前面所划分出来的那个子表达式,当(\w+)匹配到of的时候,\1也匹配of,当(\w+)匹配and的时候,\1也匹配and。\1表示模式里的第一个子表达式匹配的结果,\2表示模式里第二个子表达式匹配的结果,\3表示第三个子表达式匹配的结果,以此类推。需要注意的是,不同的正则表达式的实现在实现回溯引用的时候,在语法方面存着差异。回溯引用只能用来引用模式里的子表达式,同时,回溯引用匹配通常从1开始计数,在许多实现中,第0个匹配即\0用来代表整个表达式。
- 大小写转换
- \E用于结束\L或\U转换
- \L用于把\L和\E之间的字符全部转换为小写
- \l用于把下一个字符转换为小写
- \u用于把下一个字符转换为大写
\U用于把\U和\E之间的字符全部转换为大写
以上的这些元字符主要应用与正则表达式的替换应用中,正则表达式除了用于搜索(字符串模式匹配)之外,其另一个主要的作用便是进行文本替换。在进行替换的时候,可以使用回溯引用对符合搜索模式的进行字符串进行引用
前后查找
有时候,我们需要用正则表达式标记要匹配的文本的位置(而不仅仅是文本本身)。这就引出了前后查找的概念(lookaround,对某一位置的前后内容进行查找),前后查找分为向前查找和向后查找两部分内容。需要注意的是,前后查找中的前、后模式与被查找文本的相对位置而言,左为前
向前查找
向前查找指定一个必须匹配但不在结果中返回的模式。向前查找实际就是一个子表达式,而且从格式上看也确实如此。从语法上看,向前查找模式其实就是一个以?=开头的子表达式,需要匹配的文本跟在=后面。向前查找,用于查找(?=)之前的文本,(?=)子表达式需要写在其它正则表达式语句之后如.*(?=:)
例子如下:
文本:
正则表达式:
.*(?=:)
匹配结果:
http https
正则表达式修改为:
.*(:)
匹配结果:
http: https:
向后查找:
向后查找的概念和向前查找的概念差不多,值不过一个是查找向前查找操作符之前的文本,一个是查找向后查找操作符之后的文本。向后查找操作符是?<=,向后查找操作符和向前查找操作符一样,必须要用在一个子表达式里,而且后面跟要进行匹配的文本。向后查找的子表达式(?<=)需要写在其它正则表达式语句之前即如(?<=:).*
前后查找也可以使用!进行取非操作。(?!)表示负向前查找,(?<!)表示负向后查找,其分别表示不以(?!)中指定模式为结尾的的字符以及不以(?<!)中指定模式为开头的字符
嵌入条件
正则表达式的另一个不常使用的强大功能是在表达式的内部嵌入条件处理功能。需要注意的是,并非所有的正则表达式实现都支持条件处理。
正则表达式里的条件要用?来进行定义。嵌入条件的使用不外乎有如下两种情况:
1.根据一个回溯引用来进行条件处理
2.根据一个前后查找来进行条件处理
回溯引用条件:
回溯引用条件在一个前面的子表达式搜索取得成功的情况下才允许使用一个表达式。其语法格式如下(?(回溯引用)回溯引用存在时才执行的子表达式|回溯引用不存在时才执行的子表达式)需要注意的是,回溯引用的编号并不需要进行转义即?(1)这样的格式是正确的,而?(\1)这样的格式是不正确的。
前后查找条件:
前后查找条件只在一个向前查找或向后查找操作取得成功的情况下才允许一个表达式被使用。其语法格式和回溯引用条件的相似,只需要把回溯引用替换为一个完整的前后查找表达式即可。
K:正则表达式之进阶的更多相关文章
- java正则表达式的进阶使用20180912
package org.jimmy.autosearch20180821.test; import java.util.regex.Matcher; import java.util.regex.Pa ...
- java正则表达式基础知识(转)
1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- 框架----Django之Form提交验证(一)
一.Form提交验证与Ajax提交验证的运用实例 Form表单提交时会刷新页面,输入失败时,输入框内内容也会随之刷新不能保留:而Ajax提交是在后台偷偷提交,不会刷新页面,因此也就可以保留页面输入框内 ...
- C++后台研发面试总结
前言: 从中秋到国庆这几天面试了几家公司,有大公司也有小公司,连续几天面试没有系统的整理整理,正好有时间系统的整理一下,好多考点牛客的大佬们都分享过了,虽然每个人的方向不相同,不过多看一些总能找到一些 ...
- Linux常用三十七条指令
Linux常用三十七条指令 基础指令(11):ls,pwd,cd,mkdir,touch,cp.mv,rm,vim,>/>>/,cat 进阶指令(10):df,free,head,t ...
- 看无可看 分治FFT+特征值方程
题面: 看无可看(see.pas/cpp/c) 题目描述 “What’s left to see when our eyes won’t open?” “若彼此瞑目在即,是否终亦看无可看?” ---- ...
- 高效编程:在IntelliJ IDEA中使用VIM
硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! 概述 Vim是一个功能强大.高度可定制的文本编辑器; 具体有多强大,我现 ...
随机推荐
- python 生成html文件(表格)
import pandas as pd def convert_to_html(result,title): d = {} index = 0 for t in title: d[] = result ...
- websocket-php
下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...
- svn up出现类似svn: Error converting entry in directory '.' to UTF-8问题解决
执行svn up命令报错如下 # svn up svn: Error converting entry svn: Valid UTF- data (hex:) followed by invalid ...
- 实践作业3:白盒测试----我是如何写测试用例DAY6
一开始接到写白盒测试的任务,我感觉挺难的,因为感觉之前我所想到的都是黑盒测试啊,说到测试系统逻辑,感觉就有些神秘的样子没有思路了,那黑盒和白盒写的到底有啥区别.后来我请教了实验室的一个同学,他虽然还没 ...
- 使用java类破解MyEclipse
今天在网上查资料的时候无意中发现使用java类破解MyEclipse的注册码问题.跟大家分享一下 1.建立JAVA Project,随便命名,只要符合规则就行 2.在刚刚建好的Project右击src ...
- Effective Java 第三版——4. 使用私有构造方法执行非实例化
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Android - include属性用法
include属性用法 本文地址: http://blog.csdn.net/caroline_wendy Android的layout中, 能够使用include属性样式, 这样能够把不同的layo ...
- ElasticSearch和ElasticSearch Head环境搭建和数据模拟
首先elasticsearch-6.0.0\bin目录下运行elasticsearch服务 修改elasticsearch-6.0.0\elasticsearch.yml文件 在文件最后加入下面代码, ...
- 使用Myeclipse为数据表创建hibernate实体对象
hibernate是orm框架的一种,orm即Object Relational Mapping,对象映射关系,其主要作用是将数据库(mysql,mssql,oracle)的对象转换为具体编程语言(如 ...
- linux部署服务器遇到tomcat already start
linux部署服务器遇到tomcat already start 前言,之前做了个汽车停车计费的后端,然后现在需要部署到服务器.正常部署,使用secureFx找到所属webapps目录,将文件上传.然 ...