正则表达式简明教程(持续更新中)

前言

这是一份比较简单的正则表达式指南,是我按照自己学习正则时做的笔记整理出来的,并不能保证没有瑕疵,但我会尽最大可能来完善它,特此我在标题上加上了 持续更新

格式

为了使大家更加容易阅读,我在使用了几处高亮, 例子统一用黄色标注, 注意事项使用红色警示, 专业术语加粗。

目录

  1. 引言
  2. 什么事正则表达式
  3. 元字符
  4. 重复
  5. 转义字符
  6. 反义
  7. 字符类
  8. 分支条件
  9. 分组
  10. 向后引用
  11. 零宽断言
  12. 负向零宽断言
  13. 注释
  14. 贪婪与懒惰
  15. 附录

引言

最近给大一讲解了下正则表达式,顺便整理了份资料,共享出来。可能有点小偏差,但是正如题目中所说的,这是一篇不断完善,不断扩充的博文。 好了,言归正传,我们平时会遇到比较多的字符串,尤其是在处理文本的时候,我想这方面做Linux运维的应该深有体会。如果我们需要搜索某个文本中 具有某种规律的字符串时应该怎么办呢?很明显grep+正则。下面我就来简单介绍下什么是正则表达式,以及它的用法。

什么是正则表达式?

在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。如,我们可以使用 25[0-5]|2[0-4]\d|^1?[1-9]?\d$来匹配0-255。

元字符

\b 匹配字符串的开始或结束(隔离空格)
\w 匹配字母、数字、下划线或汉字
\s 匹配任意的空白符
^ 匹配字符串的开始
$ 匹配字符串的结束
. 匹配除换行符以外的任意字符
\0nn 匹配ASCII中八进制代码为nn的字符
\xnn 匹配ASCII中十六进制代码为nn的字符
\unnnn 匹配Unicode中十六进制代码为nn的字符
\cN 匹配ASCII控制符
这些都是十分基础的元字符,下面我们给出2个例子:
  1. ^\d\s\d$这条正则表达式表示一个字符串,它的特征是以数字开始和结束,并且两个数字之间有个空格
  2. \btt\b 这条正则表达式能够识别“cattac tt”中的后一个“tt

重复

* 重复零次或更多次
+ 重复一次或多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多
{n,m} 重复n到m次
重复如果使用得当,能够极大地缩短正则表达式地长度,以下是2个简单的例子:
  1. Linux\d+ 这条表达式能够匹配Linux以及其后更随的至少一个数字,有点拗口,打个比方,Linux3
  2. \b\d{7}\b这条表达式将能够匹配独立的7个数字组成的字符串

转义字符

从上面的元字符中我们可以看到有些字符被正则表达式给占用了,此时我们就需要将他们转义,十分简单,我们只需要在被占用的字符前面加上\,对就像大多数程序语言一样处理就行了,如\.,\^,\$,\\,\(,\)等等。
\a 报警
\t 制表符
\v 竖向制表符
\f 换页符
\n 换行符
\e Esc

反义

\W 匹配任意不是\w的字符
\S 匹配任意不是\s的字符
\D 匹配任意不是\d的字符
\B 匹配任意不是\b的位置
[^x] 匹配除了x以外的任意字符
[^as] 匹配除了as以外的任意字符
反义就相当于元字符的补集,其中的\B比较难以理解。 那么,我们来深究下\b到底表示的是什么东西?它表示一个特殊位置,即字符与空格之间的位置。 由此类比,\B表示的是字符与字符之间的位置,不过这里的字符并不包括空白字符。 \B并不常用,它包含的位置实在是太具普遍性了。。。 同样,我们给出2个例子:
  1. \b[^z]+\b 匹配不含z的字符串
  2. <s[^>\s]+> 匹配用<>括起来的以s开头的不包含空格的字符串

字符类

上述的\d表示数字0-9,那么假设我们只需要匹配2-5,那么该怎么办?显然,到目前为止,我们并没有提到相关技术。 此时我们需要的是自己定义字符类了,方法很简单,使用[]将你需要定义的字符类括起来就行了,以下是几个例子:
  1. [2-5] 表示匹配2-5,当然你完全可以使用[2345],如果你不嫌累的话
  2. [a-z] 匹配所有小写字母
  3. [a-zA-Z] 匹配所有大小写字母

分支条件

什么是分支条件呢?请不要着急,我们先来讲述一个案例。 假设现在我们有2串电话号码,分别是(010)12345678和010-12345678,它们均是某电话号码的合法表示,那么我们应该如何来通过正则表达式来匹配呢? 很简单,使用分支——“|”,也可以理解为“或”。接下来我们就试着用分支来解决上述问题。
  1. \(010\)\d{8}匹配(010)那种表示方式
  2. 010-\d{8}匹配另外一种
  3. 我们将上述两个式子通过|连接,即(\(010\)|010-)\d{8}

分组

细心的读者应该会发现,到目前为止我们所针对都是单个字符的匹配,那么一段字符串如何精确匹配? 这个时候我们就要引入“分组”的概念了。所谓分组,其实就是使用()将需要匹配的字符串括起来,这个时候的重复就是针对整个括号内的内容了。同时,分组也为我们引入新的概念奠定了基础,这个后面会提到。 用例子来说话:
  1. ([a-z]\d)+匹配一个或者多个以小写字母和数字的组合
  2. (\d{3}.){3}\d{3}实现一字符串,其具体形式类似于ip,只是其有效值为000-999,我们暂时不考虑复杂的例子

向后引用

其实分组还有个特性,那就是它的识别字符会被引擎直接标号,供我们接下来直接引用,下面我们就来介绍这方面的特性。 首先是格式,这里的具体格式有两种,其一是使用默认组号;其二是自定义标记。下面我们分开来介绍。 默认形式\b(\w+)\b\s+\b\1\b 我将相关部分使用红色标识了,这里的第一个分组内容被引擎匹配后,会被编上号码(注意,是从1开始的),接下来我们就可以通过\1来引用了 用户定义 \b(?<Word>\w+)\b\s+\b\k<Word>\b 这个表达式的功能和上面是一样的只是我们此时将默认标识换成了自己定义的标志,不过这里其实还有另一种形式\b(?'Word'\w+)\b\s+\b\k'Word'\b

零宽断言

零宽断言,听起来很玄乎,其实它和之前介绍的^,$,\b一样,都是用来标识一个位置,只不过我们可以自由定义这个位置罢了。 (?=exp)也叫 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式 exp。比如 \b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。 (?<=exp)也叫 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式 exp。比如 (?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。 下面这个例子同时使用了这两种断言:
  • (?<=\s)\d+(?=\s)匹配以空白符间隔的数字(不包括这些空白符)。

负向零宽断言

零宽断言是定义符合条件的位置,那么必然,它是有补集的,那就是负向零宽断言。多位负向零宽断言,就是指不符合定义的位置。 (?!exp)也叫 零宽度负预测先行断言,断言此位置的后面不能匹配表达式 exp。例如: \d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字; \b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。 (?<!exp)也叫 零宽度负回顾后发断言,断言此位置的前面不能匹配表达式 exp。例如: (?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

注释

就像程序语言能够添加注释一样,正则表达式也是可以的,尤其是在式子比较长的时候,注释显得尤为重要。使用注释的方式就是(?#comment),例如 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

贪婪与懒惰

正则表达式是具有双重人格的,为什么这么说呢?且看本段。 当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符。例如: a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这就是 贪婪匹配。 有时,我们更需要 懒惰匹配——匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。例如: a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aabab
*? 重复任意次,但尽可能少重复
+? 重复1次或更多,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

附录

修改记录:

2013-3-8 --> 编写正则表达式最基础的知识点


如要转载本人的文章,请注明出处。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章&#160;jquery.validate使用攻略1 第二章&#160;jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = &#39;ye wen jun&#39;;let ans = name.replace(/\s/g, &#39;&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod(&quot;letters&quot;, function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) &lt;script type=&quot;text/javascript&quot;&gt; function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from &quot;@/utils/validate&quot;; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: &lt;!-- 表单 --&gt; &lt;el-form ref=&quot;rulesForm&quot; :rules=&quot;formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 &lt;input type=&quot;text&quot; maxlength=&quot;5&quot; /&gt; //可以 &lt;input type=&quot;number&quot; maxlength=&quot;5&quot; /&gt; //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 &lt;input type=&quot;text&quot; onkeyup=&quot;value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf