子表达式:

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

  • 表达式(\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. LVS+keepalived快速搭建测试环境

    #LVS+keepalived快速搭建测试环境 #LVS+keepalived快速搭建测试环境 #centos6 X64 # LVS 负载均衡模式:DR(直接路由) 192.168.18.31 mas ...

  2. QTP生成随机数字+字母

    以下函数实现随机生成17位数(包括字母和数字),仍有改进的空间,可根据具体要求适当修改 Dim targetstring '调用返回函数给变量.Function过程通过函数名返回一个值 targets ...

  3. OGNL简介

    OGNL 一:OGNL简介 OGNL的全称是Object  Graph  Navigation  Language即对象导航语音.它是一个开源项目,工作在视图层,用来取代页面中的java脚本.简化数据 ...

  4. Linux基础-最基础

    Linux基础 为了更好的学习知识,开通此博客,以前博客丢了...记录一下知识点,希望能在这里与大家互相学习交流. 20171113 14:00 Linux基础-基本知识 Linux树状文件系统结构 ...

  5. 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)

    容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...

  6. Xamarin 使用极光推送 详细教程

    源码下载地址:http://download.csdn.net/download/kendocross/8677263  有兴趣的看以去看看 一.首先新建一个Xamarin.Android 项目,过程 ...

  7. windows 怎样查看port占用情况

    開始--执行--cmd 进入命令提示符 输入netstat -ano 就可以看到全部连接的PID 之后在任务管理器中找到这个PID所相应的程序假设任务管理器中没有PID这一项,能够在任务管理器中选&q ...

  8. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)

    题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...

  9. nat的翻译类型(2)--动态nat

    目的:在1.1 1.2 1.3 三台内网的服务器访问外网的服务器(202.1.1.2)时,将内网ip转换为外网ip. 1.设置内网三台服务器的Ip ,网关,以及外网服务器的ip网关 分别为:192.1 ...

  10. idea java 1.5 过时

    解决方案: 1.修改maven的setting.xml文件,添加以下内容,此设置为jdk1.8 <profile> <id>jdk-1.8</id> <act ...