前言

正则表达式是很多程序员,甚至是一些有了多年经验的开发者薄弱的一项技能。大家都很多时候都会觉得正则表达式难记、难学、难用,但不可否认的是正则表达式是一项很重要的技能,所有我将学习和使用正则表达式时的关键点整理如下,供大家参考。

不同语言中的正则表达式写法有少许差异,本文将使用Javascript中的语法。

什么是正则表达式?

正则表达式(Regular Expression或Regex),是用于定义某种特定搜索模式的字符组合。正则表达式可用于匹配、查找和替换文本中的字符,进行输入数据的验证,查找英文单词的拼写错误等。

开始

在Javascript中,一个正则表达式以 / 开头和结尾,所以简单至 /hello regexp/ 就是一个正则表达式。

Flags(标志符或修饰符)

Flags写在结束的/之后,可以影响整个正则表达式的匹配行为。常见的flags有:

  1. g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配
  2. i:忽略大小写(case-insensitive);在匹配时忽略英文字母的大小写
  3. m:多行匹配(multiline);将开始和结束字符(^和$)视为在多行上工作,即分别匹配每一行(由 nr 分割)的开始和结束,而不只是只匹配整个输入字符串的最开始和最末尾处

去左右空格:

/(^s+|s+$)/g

Character Sets(字符集合)

用于匹配字符集合中的任意一个字符,常见的字符集有:

  1. [xyz]:匹配 "x""y"`"z"`
  2. [^xyz]:补集,匹配除 "x" "y" "z"的其他字符
  3. [a-z]:匹配从 "a""z" 的任意字符
  4. [^a-n]:补集,匹配除 "a""n" 的其他字符
  5. [A-Z]:匹配从 "A""Z" 的任意字符
  6. [0-9]:匹配从 "0""9" 的任意数字

比如匹配所有的字母和数字可以写成:

/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i

Quantifiers (量词)

在实际使用中,我们常常需要匹配同一类型的字符多次,比如匹配11位的手机号,我们不可能将 [0-9] 写11遍,此时我们可以使用Quantifiers来实现重复匹配。

  1. {n}:匹配 n
  2. {n,m}:匹配 n-m
  3. {n,}:匹配 >=n
  4. ?:匹配 0 || 1
  5. *:匹配 >=0 次,等价于 {0,}
  6. +:匹配 >=1 次,等价于 {1,}

Metacharacters(元字符)

在正则表达式中有一些具有特殊含义的字母,被称为元字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。

常见的元字符有:

  1. d:匹配任意数字,等价于 [0-9]
  2. D:匹配任意非数字字符;d 的补集
  3. w:匹配任意基本拉丁字母表中的字母和数字,以及下划线;等价于 [A-Za-z0-9_]
  4. W:匹配任意非基本拉丁字母表中的字母和数字,以及下划线;w 的补集
  5. s:匹配一个空白符,包括空格、制表符、换页符、换行符和其他Unicode空格
  6. S:匹配一个非空白符;s的补集
  7. b:匹配一个零宽单词边界,如一个字母与一个空格之间;例如,/bno/ 匹配 "at noon" 中的 "no"/lyb/ 匹配 "possibly yesterday." 中的 "ly"
  8. B:匹配一个零宽非单词边界,如两个字母之间或两个空格之间;例如,/Bon/ 匹配 "at noon" 中的 "on"/yeB/ 匹配 "possibly yesterday." 中的 "ye"
  9. t:匹配一个水平制表符(tab)
  10. n:匹配一个换行符(newline)
  11. r:匹配一个回车符(carriage return)

Special Characters (特殊字符)

正则中存在一些特殊字符,它们不会按照字面意思进行匹配,而有特殊的意义,比如前文讲过用于量词的?*+。其他常见的特殊字符有:

  1. :转义字符,可以将普通字符转成特殊字符。比如 w;也可以将特殊字符转成字面意思,比如 + 匹配 "+"
  2. .:匹配任意单个字符,但是换行符除外:n, r, u2028u2029;在字符集中([.]),无特殊含义,即表示 '.' 的字面意思
  3. |:替换字符(alternate character),匹配 | 前或后的表达式。比如需要同时匹配 "bear""pear",可以使用 /(b|p)ear/ 或者 /bear|pear/;但是不能用 /b|pear/,该表达式只能匹配 "b""pear"
  4. ^:匹配输入的开始。比如,/^A/ 不匹配 "an Apple" 中的 "A",但匹配 "An apple" 中的 "A"
  5. $:匹配输入的结尾。比如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"^$ 在表单验证时常需要使用,因为需要验证从开始到结尾的一个完整输入,而不是匹配输入中的某一段

Groups(分组)

  1. (xyz):捕获分组(Capturing Group),匹配并捕获匹配项;例如,/(foo)/ 匹配且捕获 "foo bar." 中的 "foo"。被匹配的子字符串可以在结果数组的元素 [1], ..., [n] 中找到,或在被定义的 RegExp 对象的属性 1, ...,1,...,9 中找到
  2. (?:xyz):非捕获分组(Non-capturing Group),匹配但不会捕获匹配项;匹配项不能再次被访问到
  3. nn 是一个正整数,表示反向引用(back reference),指向正则表达式中第n个括号(从左开始数)中匹配的子字符串;例如,/apple(,)sorange1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"

应用

上面罗列出了这么多正则表达式的语法和规则,可以在一定程度上帮助我们分析和理解一段正则表达式的作用,但是如何将这些规则组合并创造出有特定作用的表达式还需要我们自己多加练习,下面举几个例子来说明运用这些规则。

1. 匹配手机号码

我们先从比较简单的匹配手机号码开始。目前国内的手机号码是1(3/4/5/7/8)开头的11位数字,因此手机号码的正则可以分解为以下几部分:

  1. 1 开头:/^1/
  2. 第2位为3、4、5、7、8中的一个:/[34578]//(3|4|5|7|8)/
  3. 剩余3-11位均为数字,并以数字结尾:/d{9}$/

组合起来即为 /^1[34578]d{9}$//^1(3|4|5|7|8)d{9}$/,因为使用捕获括号存在性能损失,所以推荐使用第一种写法。

var re = /^1[34578]d{9}$/;
var num = prompt();
alert(re.test(num));

原文:https://segmentfault.com/a/1190000018489883

手机号正则表达式验证_还不会正则表达式?看这篇!相关推荐

  1. 手机号正则表达式验证_想精通正则表达式 这几个正则表达式学习资料及工具你必须有!...

    正则表达式不是什么开发语言,也不什么脚本语言,但是你在做项目开发的时候,离不开它.你可以把它理解过一种逻辑公式,正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本.正则对刚入门的程序员,甚至 ...

  2. java中正则表达式并集_对Java中正则表达式的一些理解

    2016-12-11 22:26:18 正则表达式的意义:正则表达式是一个字符串处理工具,可以对字符串进行查找/提取/分割/替换等等,也可以对用户输入的内容进行匹配. 常用的预定义字符就不解释了,网上 ...

  3. python正则表达式操作指南_比较详细Python正则表达式操作指南(re使用)

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.使用这个小型语言,你可以为想要匹配的相应字符串集指定规则:该 ...

  4. 正则表达式基本符号_如何使用基本正则表达式更好地搜索并节省时间

    正则表达式基本符号 Whether you've been searching with Grep or looking at programs that can batch rename files ...

  5. 正则表达式发明者_【D1n910】正则表达式入门(三)

    正常操作,正常分析,大家好,我是D1n910. 最近又发生了一些很严重的事情,祥林嫂是可怜的,可是因为又祥林嫂的存在,让一些人可能不愿意向别人倾诉自己"悲惨"的经历了. 正则表达式 ...

  6. python正则表达式编译_用Python编译正则表达式

    嗯,这很奇怪.到目前为止,我的知识(在其他来源中,from this question)表明了我最初的答案: 第一个答案 Python缓存您使用的最后100个regex,因此即使您不显式地编译它们,也 ...

  7. linux正则表达式验证合法ip地址,Shell正则表达式验证IP地址

    本机多个IP ifconfig | awk '/inet/{print $2}' | awk -F: '{print $2}' 首先,先用这个来着 CheckIPAddress() { echo $1 ...

  8. 及时复盘的好处_还不会复盘?这篇有最全的复盘介绍

    Hello,鲶鱼精.我是你们的三点半呀~ 这篇文章推荐鲶鱼精一个神仙技能,复盘. 复盘的3个最重要的价值:1有助于复盘者避免犯同样的错误:2 有助于找到事情的底层规律:3 使复盘者始终坚持在正确的方向 ...

  9. 苹果sf字体_还在用 iPad 看剧吗?苹果全新发布的 iPadOS 不止能让你做图了!

    注:本文由优设网独家撰写,未经优设网许可请勿转载.授权请添加编辑微信:「gg_and_xb」 WWDC19 可能是最近几年最令人激动的苹果开发者大会了. 重回高端专业领域的 Mac Pro 不仅仅是性 ...

最新文章

  1. Mask R-CNN 源代码终上线,Facebook 开源目标检测平台—Detectron
  2. CentOS安装ElasticSearch及其问题解决
  3. POJ 1573 POJ 2632(两道有趣的Robot)实例
  4. 认识 lib 目录里的 .so 文件
  5. 学习MVVM设计模式后第一次用于生产
  6. 徐磊(Devops):一名写了十几年代码但还没写够的程序员
  7. 清华大学 现代软件工程 学生特别想学的领域
  8. c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
  9. 2018年12月精选文章目录一览
  10. 如何实现数据跨链交互?
  11. 推荐一款代码神器,代码量至少省一半! 1
  12. 神经网络API、Kotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性
  13. phpcount数组报错_PHPExcel把导入的excel表格转换为数组,然后运行,浏览器什么也不显示,也不报错...
  14. 游戏场景设计探究:冬夏季节光色模型
  15. null object java_java1.8--Null Object模式
  16. 中国首档程序员真人秀,20位选手找bug做模型,结果一开场主办方就惨遭攻击
  17. 调色板程序c语言,用C语言开发NES游戏(CC65)05、调色板
  18. vm虚拟机安装凤凰os安卓系统
  19. 20 个让你效率更高的 CSS 代码技巧
  20. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格

热门文章

  1. redis数据库的安装配置
  2. Spring Boot 2.0.0.M7 生产环境部署
  3. mysql的主主复制模型
  4. WordPress建站指南
  5. Docker入门之五数据管理
  6. HBase的环境配置及其应用
  7. KMP算法的一个C++实现
  8. 分享30个打动你的摄影师作品集网站
  9. 学习使用资源文件[6] - 菜单资源
  10. JA-SIG(CAS)学习笔记1