正则表达式必知必会

一、概述

正则表达式用于文本内容的查找和替换。

正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。

正则表达式在线工具

二、匹配单个字符

. 可以用来匹配任何的单个字符,但是在绝大多数实现里面,不能匹配换行符;

. 是元字符,表示它有特殊的含义,而不是字符本身的含义。如果需要匹配 . ,那么要用 \ 进行转义,即在 . 前面加上 \ 。

正则表达式一般是区分大小写的,但也有些实现不区分。

正则表达式

rabbit

匹配结果

My name is rabbit .

三、匹配一组字符

[ ] 定义一个字符集合;

0-9、a-z 定义了一个字符区间,区间使用 ASCII 码来确定,字符区间在 [ ] 中使用。

- 只有在 [ ] 之间才是元字符,在 [ ] 之外就是一个普通字符;

^ 在 [ ] 中是取非操作。

应用

匹配以 abc 为开头,并且最后一个字母不为数字的字符串:

正则表达式

abc[^0-9]

匹配结果

  1. abcd
  2. abc1
  3. abc2

四、使用元字符

匹配空白字符

元字符说明
[\b]回退(删除)一个字符
\f换页符
\n换行符
\r回车符
\t制表符
\v垂直制表符

\r\n 是 Windows 中的文本行结束标签,在 Unix/Linux 则是 \n。

\r\n\r\n 可以匹配 Windows 下的空白行,因为它匹配两个连续的行尾标签,而这正是两条记录之间的空白行;

匹配特定的字符

1. 数字元字符

元字符说明
\d数字字符,等价于 [0-9]
\D非数字字符,等价于 [^0-9]

2. 字母数字元字符

元字符说明
\w大小写字母,下划线和数字,等价于 [a-zA-Z0-9_]
\W对 \w 取非

3. 空白字符元字符

元字符说明
\s任何一个空白字符,等价于 [\f\n\r\t\v]
\S对 \s 取非

\x 匹配十六进制字符,\0 匹配八进制,例如 \xA 对应值为 10 的 ASCII 字符 ,即 \n。

五、重复匹配

  • + 匹配 1 个或者多个字符
  • ** * 匹配 0 个或者多个字符
  • ? 匹配 0 个或者 1 个字符

应用

匹配邮箱地址。

正则表达式

[\w.]+@\w+\.\w+

[\w.] 匹配的是字母数字或者 . ,在其后面加上 + ,表示匹配多次。在字符集合 [ ] 里,. 不是元字符;

匹配结果

abc.def@qq.com

  • {n} 匹配 n 个字符
  • {m,n} 匹配 m~n 个字符
  • {m,} 至少匹配 m 个字符

* 和 + 都是贪婪型元字符,会匹配尽可能多的内容。在后面加 ? 可以转换为懒惰型元字符,例如 *?、+? 和 {m,n}? 。

正则表达式

a.+c

匹配结果

abcabcabc

由于 + 是贪婪型的,因此 .+ 会匹配更可能多的内容,所以会把整个 abcabcabc 文本都匹配,而不是只匹配前面的 abc 文本。用懒惰型可以实现匹配前面的。

六、位置匹配

单词边界

\b 可以匹配一个单词的边界,边界是指位于 \w 和 \W 之间的位置;\B 匹配一个不是单词边界的位置。

\b 只匹配位置,不匹配字符,因此 \babc\b 匹配出来的结果为 3 个字符。

字符串边界

^ 匹配整个字符串的开头,$ 匹配结尾。

^ 元字符在字符集合中用作求非,在字符集合外用作匹配字符串的开头。

分行匹配模式(multiline)下,换行被当做字符串的边界。

应用

匹配代码中以 // 开始的注释行

正则表达式

^\s*\/\/.*$

匹配结果

  1. public void fun() {
  2.      // 注释 1
  3.      int a = 1;
  4.      int b = 2;
  5.      // 注释 2
  6.      int c = a + b;
  7. }

七、使用子表达式

使用 ( ) 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。

子表达式可以嵌套,但是嵌套层次过深会变得很难理解。

正则表达式

(ab){2,}

匹配结果

ababab

| 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。

正则表达式

(19|20)\d{2}

匹配结果

  1. 1900
  2. 2010
  3. 1020

应用

匹配 IP 地址。

IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的:

  • 一位数字
  • 不以 0 开头的两位数字
  • 1 开头的三位数
  • 2 开头,第 2 位是 0-4 的三位数
  • 25 开头,第 3 位是 0-5 的三位数

正则表达式

((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))

匹配结果

  1. 192.168.0.1
  2. 00.00.00.00
  3. 555.555.555.555

八、回溯引用

回溯引用使用 \n 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。

应用

匹配 HTML 中合法的标题元素。

正则表达式

\1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。

<(h[1-6])>\w*?<\/\1>

匹配结果

  1. <h1>x</h1>
  2. <h2>x</h2>
  3. <h3>x</h1>

替换

需要用到两个正则表达式。

应用

修改电话号码格式。

文本

313-555-1234

查找正则表达式

(\d{3})(-)(\d{3})(-)(\d{4})

替换正则表达式

在第一个子表达式查找的结果加上 () ,然后加一个空格,在第三个和第五个字表达式查找的结果中间加上 - 进行分隔。

($1) $3-$5

结果

(313) 555-1234

大小写转换

元字符说明
\l把下个字符转换为小写
\u把下个字符转换为大写
\L把\L 和\E 之间的字符全部转换为小写
\U把\U 和\E 之间的字符全部转换为大写
\E结束\L 或者\U

应用

把文本的第二个和第三个字符转换为大写。

文本

abcd

查找

(\w)(\w{2})(\w)

替换

$1\U$2\E$3

结果

aBCd

九、前后查找

前后查找规定了匹配的内容首尾应该匹配的内容,但是又不包含首尾匹配的内容。

向前查找使用 ?= 定义,它规定了尾部匹配的内容,这个匹配的内容在 ?= 之后定义。所谓向前查找,就是规定了一个匹配的内容,然后以这个内容为尾部向前面查找需要匹配的内容。向后匹配用 ?<= 定义(注: JavaScript 不支持向后匹配,Java 对其支持也不完善)。

应用

查找出邮件地址 @ 字符前面的部分。

正则表达式

\w+(?=@)

结果

abc @qq.com

对向前和向后查找取非,只要把 = 替换成 ! 即可,比如 (?=) 替换成 (?!) 。取非操作使得匹配那些首尾不符合要求的内容。

十、嵌入条件

回溯引用条件

条件为某个子表达式是否匹配,如果匹配则需要继续匹配条件表达式后面的内容。

正则表达式

子表达式 (\() 匹配一个左括号,其后的 ? 表示匹配 0 个或者 1 个。 ?(1) 为条件,当子表达式 1 匹配时条件成立,需要执行 ) 匹配,也就是匹配右括号。

(\()?abc(?(1)\))

结果

  1. (abc)
  2. abc
  3. (abc

前后查找条件

条件为定义的首尾是否匹配,如果匹配,则继续执行后面的匹配。注意,首尾不包含在匹配的内容中。

正则表达式

?(?=-) 为前向查找条件,只有在以 - 为前向查找的结尾能匹配 \d{5} ,才继续匹配 -\d{4} 。

\d{5}(?(?=-)-\d{4})

结果

  1. 11111
  2. 22222-
  3. 33333-4444

参考资料

  • BenForta. 正则表达式必知必会 [M]. 人民邮电出版社, 2007.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode设计链表,非常工整的实现你值得拥有

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;val 和 next。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。如果要使用双向链表&#xff0c;则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所…

《一天聊一个设计模式》 策略

9. 策略&#xff08;Strategy&#xff09; Intent 定义一系列算法&#xff0c;封装每个算法&#xff0c;并使它们可以互换。 策略模式可以让算法独立于使用它的客户端。 Class Diagram Strategy 接口定义了一个算法族&#xff0c;它们都实现了 behavior() 方法。Context 是…

如何在eclipse jee中创建Maven project并且转换为Dynamic web project

转自&#xff1a;http://www.javaniu.com/maven-jee-dynamic-web-project.htm 注意:该文档只针对以下eclipse版本&#xff0c;如图 一.在eclipse的官方站点下载eclipse jee版本,地址http://www.eclipse.org/downloads/download.php?file/technology/epp/downloads/release/ind…

《一天聊一个设计模式》 抽象工厂

4. 抽象工厂&#xff08;Abstract Factory&#xff09; Intent 提供一个接口&#xff0c;用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族&#xff0c;也就是很多对象而不是一个对象&#xff0c;并且这些对象是相关的&#xff0c;也就是说必须一起…

精华Java问题总结

当时在网上汇总了不知多少面试和基础题&#xff0c;弄了个精华总结。 1、一个".java"源文件中是否可以包括多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制&#xff1f; 可以有多个类&#xff0c;但只能有一个public的类&#xff0c;并且public的类…

复习Java的精华总结

小白和老手都应该看看的总结 输入 java.util.Scanner 是 Java5 的新特征&#xff0c;我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法&#xff1a; Scanner s new Scanner(System.in); 使用方法如下&#xff1a; //对应类型用对应的方法接…

超硬核!躺进BAT以后我总结了出现最多的15道数组题

作为一个硬核作者&#xff0c;绝不和你扯废话&#xff0c;干货无套路送你 题目一&#xff1a; 给定一个数组arr&#xff0c;求出需要排序的最短子数组长度 要求&#xff1a; 时间o(n),空间o(1) 思路&#xff1a; 有序的数组中&#xff0c;任意一个数字&#xff0c;一定小于左…

《关于我的那些面经》滴滴Java岗(附答案)

手撕单例模式 所谓单例&#xff0c;就是整个程序有且仅有一个实例。该类负责创建自己的对象&#xff0c;同时确保只有一个对象被创建。 在Java&#xff0c;一般常用在工具类的实现或创建对象需要消耗资源。特点&#xff1a;类构造器私有、持有自己类型的属性、对外提供获取实…

《关于我的那些面经》——百度后端(附答案)

作者保证&#xff0c;本系列全是纯干货真实记录&#xff0c;绝对不是某些营销号瞎编乱造的面试。 一、公司的简介 百度是全球最大的中文搜索引擎&#xff0c;是中国最大的以信息和知识为核心的互联网综合服务公司&#xff0c;更是全球领先的人工智能平台型公司。2000年1月1日创…

《兔兔公司的历史》那些年,百度的荣耀和沉沦

这是全站最硬核的兔子700文章后的第一篇软文&#xff0c;觉得喜欢的同学可以三连一波&#xff0c;如果大家喜欢&#xff0c;我会出公司的历史系列、互联网大佬系列、产品经理系列&#xff0c;大家喜欢哪个呢&#xff1f; 百度公司的发展趋势 还记得南宋词人辛弃疾的那首词吗&a…

这篇不讨好任何人的回忆录,记录了我从双非学校到BAT/TMD六offer的原因

注&#xff1a;给我想个新名字好不好呀&#xff0c;采用了直接发百元红包&#xff01;没别的&#xff0c;想让大家认识兔兔rabbit&#xff0c;说一下自己的经验教训&#xff0c;应该会对很多人有帮助。 一、前言 在今年&#xff0c;我要毕业了&#xff0c;基本结束了大学生活&…

《兔子的大厂面经合集》朋友面神策数据库,第五个问题不会,直接再见(1)

这个系列计划收集几百份朋友和读者的面经&#xff0c;作者合集方便查看&#xff0c;各位有面经屯着可以联系我哦 写数据库还真不是人人都能干的&#xff0c;硬是一道别的题都没问。

兔子,撒币

作为最硬核的你兔老大&#xff0c;我狠起来连自己都骂 一、原力第一 哈哈当然不是骂自己啦哈哈&#xff0c;其实是最近csdn出了一个活动&#xff1a;原力计划s3&#xff0c;弄得我现在整天想着&#xff0c;给你们发钱。发书。发资料。 对&#xff0c;就是这个玩意&#xff1a…

超硬核!数据库学霸笔记,考试/面试随便秒杀

废话不多说&#xff0c;上干货是兔老大的传统了&#xff0c;收藏就完事了。 目录 数据库系统概论 四个基本概念 数据模型 数据库系统结构 数据库系统模式的概念 数据库系统的三级模式结构 数据库的二级映像功能与数据的独立性 数据库系统的组成 关系 关系模式 关系数…

腾讯面试Android必问11题,我说的,不信就来看看

众所周知兔子啥都会那么一点&#xff0c;不收藏等着干啥呢 1、是否使用过本地广播&#xff0c;和全局广播有什么差别&#xff1f; 引入本地广播的机制是为了解决安全性的问题&#xff1a; 正在发送的广播不会脱离应用程序&#xff0c;比用担心app的数据泄露&#xff1b;其他的…

超硬核!我统计了BAT笔试面试出现频率最高的五道题,学会了总能碰到一道

所以说不要怕算法&#xff0c;简单的题反而出现的频率最高&#xff0c;不一定非要写个几百道才面试 两数之和 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会…

不骗你,全网首创的超硬核的万字SQL题

因为上次发了数据库原理总结&#xff0c;浏览快上万了&#xff0c;所以把我总结的题目 也送给大家 上次的数据库原理总结 一&#xff0e;根据员工工资计算其个人所得税&#xff0c;3000元为起征点&#xff0c;超出3000元的部分按照10%的比例征收个人所得税&#xff0c;例如&…

学姐腾讯产品面经

顺利拿到sp offer&#xff0c;不服不行&#xff0c;不是这块料呀 系列文章历史&#xff1a; 朋友面神策数据库&#xff0c;第五个问题不会&#xff0c;直接再见 美女学姐面了美团阿里京东&#xff0c;这些经验实在太真实了 首先&#xff0c;来个背景介绍&#xff1a; 腾讯实…

关于阿里云服务器本地访问不了的问题

一&#xff1a;前几天公司购买了一台阿里云服务器&#xff0c;让我把之前的项目都移到阿里云服务器上&#xff0c;我为此专门的研究了一下阿里云服务器的基本操作和安装流程&#xff0c;这里我说一下我们公司的服务器配置如下&#xff1a; 系统就配置就是这个情况&#xff0c;下…

超硬核!十万字c++题,让你秒杀老师和面试官(上)

我发现呀&#xff0c;这大家对面试题的需求还是很大的&#xff0c;这里总结了上千道知识点&#xff0c;能换您一个收藏吗 C 引用和指针的区别&#xff1f; 指针是一个实体&#xff0c;需要分配内存空间。引用只是变量的别名&#xff0c;不需要分配内存空间。 引用在定义的时候…