正则表达式及测试工具

1. 正则表达式

  正则表达式:一种匹配文本中的字符序列的字符模式。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某种模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。

  一个正则表达式就是由普通字符(例如字符 ‘a’ 到 ‘z’)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

1.1 元字符

字符

描述

实例

\d

匹配任意的数字

\d\d可以匹配12,但不匹配a1或1a等

\D

匹配任意的非数字字符

\D\D匹配a@,不匹配12

\w

匹配单词字符(包括字母、数字、下划线和汉字)

 

\W

匹配任意的非单词字符(包括字母、数字、下划线和汉字)

\W匹配@等,不匹配a

\s

匹配任何空白字符,包括空格、制表符、换行符等

 

\S

匹配任意非空白字符

 

.

匹配除换行符之外的任意字符

 

^

匹配行的开始位置

"^The":表示所有以"The"开始的字符串("There","The cat"等)

$

匹配行的结束位置

"of despair$":表示以"of despair"结尾的字符串

\b

匹配单词的开始或结束位置

"\bcat"将匹配 "cat cat cat"首尾的"cat",中间的"cat"不会被匹配上

\B

\b的补集

"\bcat"将匹配 "cat cat cat"中间的"cat"

2. 字符类

    在正则表达式中,元字符通常一次只能匹配一个位置或字符集合中的一个字符,但是如果要匹配的字符集合没有与之相对应的元字符时,则需要自定义匹配的字符集合。此时可以使用字符类解决这个问题。字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它就会找到该匹配项。

    字符类是正则表达式中的“迷你”语言,可以在方括号" []"中定义。例如: [012345]匹配数字0,1,2,3,4,5中的任何一个。[Jj]ack匹配字符串“Jack”或者“jack”。

    然而,正则表达式[0123456789]的书写非常不方便。因此,正则表达式引入连接符“-”定义字符的范围。例如:正则表达式[0-9]等价于正则表达式[0123456789]。

3. 限定符

  正则表达式的元字符一次只能匹配一个位置或一个字符,如果要匹配零个、一个或多个字符时,则需要使用限定符。限定符用于指定允许特定字符或字符集自身重复出现的次数。常用限定符的说明如表2.11所示。

字符

描述

实例

{n}

重复n次

'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 。

{n,}

至少重复n次

'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}

重复至少n次,最多m次

"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。

+

重复至少1次,等同{1,}

'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

*

重复至少0次,等同{0,}

zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。

?

当该字符紧跟在任何一个其他限定符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

对于字符串"oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。


4. 转义字符

正则表达式定义了一些特殊的元字符,如^、$、.等。由于这些字符在正则表达式中被解释成其他的特定的意义,如果需要匹配这些字符,则需要使用转义字符来解决这一问题。转义字符为“\”(反斜杠),它可以取消这些字符(如^、$、.等)在表达式中具有的特殊意义,转义字符说明及实例如表2.12。

字符

描述

实例

\

有些字符被用来表示特殊的含义,但是要匹配其本身时就需要用转义字符。

"\\"匹配"\"

"\."匹配"."

"\*"匹配"*"

"\+"匹配"+"

"\unnnn"匹配一个4位16进制数指定的Unicode


5. 分组、“或”、以及反向引用

    前面讲到怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复一个字符串就应该使用分组。

    分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中,分组使用括号“()”表示。分组之后,可以将括号“()”之中的表达式看成一个整体来处理,然后再指定这个子表达式的重复次数。例如:“(\d{1,3}\.){3}\d{1,3}”是一个简单的IP地址匹配表达式。 “(\d{1,3}\.){3}”匹配三位数字加上一个英文句号重复3次,“\d{1,3}”匹配1到3位的数字。

     “或”使用字符“|”来表示。如果某一个字符串匹配了正则表达式中的字符“|”的左边或者右边的规则,那么该字符串也匹配了该正则表达式。例如:“0\d{2}-\d{8}|0\d{3}-\d{7}|0\d{3}-\d{8}”匹配当前国内部分地区的3种固定电话号码:一种是号码的前3位为区号,后8位为本地号码;另一种是号码的前四位为区号,后7位为本地号码;最后一种是号码的前4位为区号,后8位为本地号码。其中,区号和本地号码都使用连接符号“-”进行连接。

    反向引用:当一个正则表达式被分组之后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右,以分组的左括号“(”为标志,第一个分组组号为1,第二个分组的组号为2,以此类推。反向引用提供了查找重复字符组的方便方法。它可被认为是再次匹配同一个字符串的快捷指令。反向引用可以使用数字命名的组号,语法为:\number,也可以使用指定命名的组号,语法为:\k<name>。例如:表达式“('|")(.*?)(\1)”在匹配“'Hello',"World"”时,首先匹配到的内容是:“'Hello'”。再次匹配下一个时,可以匹配到“"World"”。

2. RegEX Tester用来测试正则表达式

regEX Tester是一个简单的用来测试正则表达式的工具,是开源的。

转载于:https://www.cnblogs.com/wangshide/archive/2012/03/17/2404059.html

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

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

相关文章

CCD与CMOS摄像头的区别

首先说一下在闭路电视监控中摄像机的CCD 和CMOS 的结构,ADC的位置和数量是最大的不同。简单的说,CCD每曝光一次,在快门关闭后进行像素转移处理,将每一行中每一个像素(pixel)的电荷信号依序传入“缓冲器”中…

Java注释教程– ULTIMATE指南(PDF下载)

编者注:在本文中,我们提供了全面的Java注释教程。 Java中的注释是一项主要功能,每个Java开发人员都应该知道如何使用它们。 我们在Java Code Geeks上提供了许多教程,例如创建自己的Java注释 , 带有自定义注释的Java注…

Jquery获取DOM绑定事件

获取到当前正在执行的事件: $(#testDive).bind(click, function(event){alert(event: event.type)}); 获取所有绑定事件: $._data(document.getElementById(testDive), events); 更多专业前端知识,请上 【猿2048】www.mk2048.com

laravel中的自定义函数的加载和第三方扩展库加载

一.自定义公共函数 1. 创建文件 app/Helpers/functions.php 2. 修改项目 composer.json 3.运行composer dump-auto 4.OK,然后你就可以在任何地方用到 app/Helpers/functions.php 中的函数了。 二.添加第三方扩展库 1.确定你要放第三方库的目录,比如还是刚…

Java EE 8发生了什么?

Java EE 8的工作进展顺利。 是时候赶上了! 无需费力就可以潜入… 不要忘记Java EE 7….. 围绕三个重要主题 HTML 5对齐–用于WebSocket的Java API(JSR 356),JSON处理(JSR 353),JAX-RS 2.0&…

HDU 1312 Red and Black

这题就是比较水的一道搜索题了&#xff0c;BFS跟DFS都能做&#xff0c;直接看代码吧&#xff01; AC code&#xff1a; View Code 1 #include <iostream> 2 #define MAX 50 3 using namespace std; 4 int w, h; 5 char map[MAX][MAX]; 6 int dir[][2] {{0, 1}, {1, 0},…

HTML5新增属性学习笔记

1、form属性 表单内的从属元素&#xff0c;可以写在表单外部。可以通过指定元素的form属性来声明元素所属表单。form的属性值为表单的id。 1 <form id"testForm"> 2 <input type"text"> 3 </form> 4 <textarea form"testFo…

Unity3D笔记十七 Unity3D生命周期

一个游戏组件的脚本有一个生命周期——一开始实例化&#xff0c;直到结束实例被销毁。在这期间&#xff0c;他们有时候处于激活状态&#xff0c;有时候处于非激活状态&#xff1b;对于活动&#xff0c;对用户有时候可见&#xff0c;有时候不可见 本文主要讨论常见脚本的的生命周…

自适应堆大小

在改进我们的测试平台以改进Plumbr GC问题检测器的同时 &#xff0c;我最终编写了一个小型测试用例&#xff0c;我认为这对于更广泛的读者来说可能很有趣。 我追求的目标是测试JVM在eden&#xff0c;survivor和Tenured空间之间如何分割堆方面的自适应性。 测试本身正在成批生成…

.Net对SQL数据库的web备份

基于B/S模式下的&#xff0c;数据库远程备份&#xff0c;备份成功后可下载到本地 1 protected void ButtonDataBackup_Click(object sender, EventArgs e) 2 { 3 string newname "数据库名" DateTime.Now.Year.ToString() DateTime.Now.Month.ToStri…

ajax向后台传递数组

$.ajax({traditional: true//这个设置为true&#xff0c;data:{"steps":["qwe","asd","zxc"]}会转换成stepsqwe&stepsasd&... }); 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

错误笔记

1、user_name a and password b时&#xff0c;无法打印到这个节点&#xff0c;原因是 a "yajuan" b 123456时 a 为字符串类型&#xff0c;b为数字类型&#xff0c;类型不同“且”的关系不成立。导致if 节点失败 转载于:https://www.cnblogs.com/wangyajuanjuan…

第一次Java 8体验

像世界其他地方一样&#xff0c;我深深地爱上了Slack。 为什么&#xff1f; 原因很多&#xff0c;但主要的原因是它提供了一种围绕通讯而非工具真正构建SDLC流程的新方法。 您认为这些天哪个更常见&#xff0c;杂乱无章的机智团队在荒野中四处徘徊&#xff0c;尽管他们有出色的…

七个重要习惯——读《高效能人士的七个习惯》整理

个人的成功习惯一&#xff1a;积极主动习惯二&#xff1a;以始为终习惯三&#xff1a;要事第一 公众的成功习惯四&#xff1a;双赢思维习惯五&#xff1a;知彼解己习惯六&#xff1a;综合综效 习惯七&#xff1a;不断更新 附图&#xff1a; 转载于:https://www.cnblogs.com/ziq…

浏览器兼容问题笔记

Safari浏览器&#xff1a; 1.safari执行history.go(-1);需要添加return false; Chrome浏览器 1.Chrome浏览器要预读图片&#xff0c;需要通过对图片的预加载。注&#xff1a;预加载前一定要将<img>加入<body> 1 /* 预加载图片 node-<img> func-回调函数 *…

http://www.tldp.org/LDP/abs/abs-guide.txt.gz

http://www.tldp.org/LDP/abs/abs-guide.txt.gz转载于:https://www.cnblogs.com/itzxy/p/11294815.html

POJ2941 SDUT2371Homogeneous squares

View Code 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 long i,j,n,g,s,t,a[1001],b[1001]; 6 char str[8001];//这里数组开大一点 第一次RT了 数比较大 7 while(scanf("%ld", &n)&&n) 8 { 9 s …

不变性如何提供帮助

在最近的几篇文章中&#xff0c;包括“ Getters / Setters。 邪恶。 期。” &#xff0c; “对象应该是不可变的”和“依赖注入容器是代码污染者” &#xff0c;我普遍将所有可变对象标记为“ setter”&#xff08;以set开头的对象方法&#xff09;。 我的论证主要基于隐喻和抽…

JS排序之冒泡排序

冒泡排序的两种策略&#xff1a; <script>// 第一种思路&#xff1a;// 一个数组中的数据&#xff0c;拿第一个和剩下的依次进行对比&#xff0c;数值小的赋值给第一个&#xff0c;一轮比较过后&#xff0c;则数值小的放在最前边。// 第二轮比较&#xff0c;则最前边的不…

浅谈.Net版(C#)的CMP模式

商城上线快2、3个月了&#xff0c;一直都懒得写点东西&#xff0c;在加上杂七杂八的事情也比较忙&#xff0c;所以都没有把这个系统当时做的整个架构思绪整理清&#xff0c;昨天才从深圳完了两天回来&#xff0c;怎感觉是要做的事来着.刚开始接触CMP模式的时候也是看了它几天,到…