子表达式:

前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的。为此,使用了子表达式的概念。子表达式是一个更大的表达式的一部分,把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当作一个独立元素来进行使用。子表达式,用(和)括起来,其()中的内容表示一个整体。其中如果要匹配字符(和字符),则必须要对其进行转义,即使用\(和\)用于匹配字符“(”和字符“)”。

  • 表达式(\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用来代表整个表达式。

  • 大小写转换
  1. \E用于结束\L或\U转换
  2. \L用于把\L和\E之间的字符全部转换为小写
  3. \l用于把下一个字符转换为小写
  4. \u用于把下一个字符转换为大写
  5. \U用于把\U和\E之间的字符全部转换为大写

    以上的这些元字符主要应用与正则表达式的替换应用中,正则表达式除了用于搜索(字符串模式匹配)之外,其另一个主要的作用便是进行文本替换。在进行替换的时候,可以使用回溯引用对符合搜索模式的进行字符串进行引用

  • 前后查找

    有时候,我们需要用正则表达式标记要匹配的文本的位置(而不仅仅是文本本身)。这就引出了前后查找的概念(lookaround,对某一位置的前后内容进行查找),前后查找分为向前查找和向后查找两部分内容。需要注意的是,前后查找中的前、后模式与被查找文本的相对位置而言,左为前

  • 向前查找

    向前查找指定一个必须匹配但不在结果中返回的模式。向前查找实际就是一个子表达式,而且从格式上看也确实如此。从语法上看,向前查找模式其实就是一个以?=开头的子表达式,需要匹配的文本跟在=后面。向前查找,用于查找(?=)之前的文本,(?=)子表达式需要写在其它正则表达式语句之后如.*(?=:)

    例子如下:

    文本:

    http://www.baidu.com/

    https://mail.fortal.com/

    正则表达式:

    .*(?=:)

    匹配结果:

    http https

    正则表达式修改为:

    .*(:)

    匹配结果:

    http: https:

  • 向后查找:

    向后查找的概念和向前查找的概念差不多,值不过一个是查找向前查找操作符之前的文本,一个是查找向后查找操作符之后的文本。向后查找操作符是?<=,向后查找操作符和向前查找操作符一样,必须要用在一个子表达式里,而且后面跟要进行匹配的文本。向后查找的子表达式(?<=)需要写在其它正则表达式语句之前即如(?<=:).*

    前后查找也可以使用!进行取非操作。(?!)表示负向前查找,(?<!)表示负向后查找,其分别表示不以(?!)中指定模式为结尾的的字符以及不以(?<!)中指定模式为开头的字符

  • 嵌入条件

    正则表达式的另一个不常使用的强大功能是在表达式的内部嵌入条件处理功能。需要注意的是,并非所有的正则表达式实现都支持条件处理。

    正则表达式里的条件要用?来进行定义。嵌入条件的使用不外乎有如下两种情况:

    1.根据一个回溯引用来进行条件处理

    2.根据一个前后查找来进行条件处理

  • 回溯引用条件:

    回溯引用条件在一个前面的子表达式搜索取得成功的情况下才允许使用一个表达式。其语法格式如下(?(回溯引用)回溯引用存在时才执行的子表达式|回溯引用不存在时才执行的子表达式)需要注意的是,回溯引用的编号并不需要进行转义即?(1)这样的格式是正确的,而?(\1)这样的格式是不正确的。

  • 前后查找条件:

    前后查找条件只在一个向前查找或向后查找操作取得成功的情况下才允许一个表达式被使用。其语法格式和回溯引用条件的相似,只需要把回溯引用替换为一个完整的前后查找表达式即可。

回到目录|·(工)·)

K:正则表达式之进阶的更多相关文章

  1. java正则表达式的进阶使用20180912

    package org.jimmy.autosearch20180821.test; import java.util.regex.Matcher; import java.util.regex.Pa ...

  2. 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&& ...

  3. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  4. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

  5. 框架----Django之Form提交验证(一)

    一.Form提交验证与Ajax提交验证的运用实例 Form表单提交时会刷新页面,输入失败时,输入框内内容也会随之刷新不能保留:而Ajax提交是在后台偷偷提交,不会刷新页面,因此也就可以保留页面输入框内 ...

  6. C++后台研发面试总结

    前言: 从中秋到国庆这几天面试了几家公司,有大公司也有小公司,连续几天面试没有系统的整理整理,正好有时间系统的整理一下,好多考点牛客的大佬们都分享过了,虽然每个人的方向不相同,不过多看一些总能找到一些 ...

  7. Linux常用三十七条指令

    Linux常用三十七条指令 基础指令(11):ls,pwd,cd,mkdir,touch,cp.mv,rm,vim,>/>>/,cat 进阶指令(10):df,free,head,t ...

  8. 看无可看 分治FFT+特征值方程

    题面: 看无可看(see.pas/cpp/c) 题目描述 “What’s left to see when our eyes won’t open?” “若彼此瞑目在即,是否终亦看无可看?” ---- ...

  9. 高效编程:在IntelliJ IDEA中使用VIM

    硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! 概述 Vim是一个功能强大.高度可定制的文本编辑器; 具体有多强大,我现 ...

随机推荐

  1. uva11636-Hello World!

    题意:已知有一行printf(“Hello World!”\n);以后就可以复制,问多少次之后就可以达到所需要的行数. 题解:模拟: #include<iostream> #include ...

  2. 51nod 1020 逆序排列 DP

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...

  3. MySQL用户管理及SQL语句详解

    1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysql.user; +--------+--- ...

  4. C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

    昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...

  5. Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤

    首先,介绍一下MySQL的几种安装方式 1.RPM.Yum 的安装方式:安装方便.安装速度快,无法定制 2.二进制:不需要安装,解压即可使用,不能定制功能 3.编译安装:可定制,安装慢. 编译安装中需 ...

  6. 使用AOP实现缓存注解

    为何重造轮子 半年前写了一个注解驱动的缓存,最近提交到了github.缓存大量的被使用在应用中的多个地方,简单的使用方式就是代码先查询缓存中是否存在数据,如果不存在或者缓存过期再查询数据库,并将查询的 ...

  7. [睡前灵感and发散思维]由一个简单的数组比较问题而想到的

    前言 据说,一只优秀的程序猿往往会有这样的经历,白天遇到一个绞尽脑汁也无法解决的问题,晚上睡了后,半夜在梦中会灵感涌现,立马起床,打开电脑,一气呵成.第二天如果不看注释,完全不知道自己找到了如此巧妙地 ...

  8. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  9. 相似QQ对话框上下部分可拖动代码

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Shell编程中的变量作用域

    有两个shell脚本文件: a.sh name=Tom echo $name ./b.sh b.sh echo "name in b.sh:"$name 运行./a.sh时输出结果 ...