正则表达式

简介

正则表达式(Regular Expression,常简写为regex、regexp或RE),使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
在编写处理字符串的时候,经常会有查找符合某些复杂规则字符串的需要,例如,查找字符串中的数字、电话号码等。正则表达式就是用于描述这些规则的工具,就是一种记录文本规则的代码。

基本语法

一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串。例如:Handel、Händel和Haendel这三个字符串,都可以由H(a|ä|ae)ndel这个模式来描述。大部分正则表达式的形式都有如下的结构:

1、选择

  • 竖线 | 代表选择(或集),具有最低优先级。例如gray|grey可以匹配grey或gray。

2、数量限定
某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括+?*{}(不加数量限定则代表出现一次且仅出现一次):

  • 加号 + 代表前面的字符必须至少出现一次。(1次或多次)。例如,goo+gle可以匹配google、gooogle、goooogle等
  • 问号 ? 代表前面的字符最多只可以出现一次。(0次或1次)。例如,colou?r可以匹配color或者colour
  • 星号 * 代表前面的字符可以不出现,也可以出现一次或者多次。(0次、1次或多次)。例如,0*42可以匹配42、042、0042、00042等。
  • 花括号 {} 代表重复的次数。{n} 重复n次。{n,}重复n次或更多次。{n,m}重复n到m次。

3、匹配

  • 圆括号 () 可以用来定义操作符的范围和优先度。例如,gr(a|e)y等价于gray|grey(grand)?father匹配father和grandfather。

上述这些构造子都可以自由组合,因此H(ae?|ä)ndelH(a|ae|ä)ndel是相同的。

精确的语法可能因不同的工具或程序而异。

元字符

常用的元字符:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

例子:
1、\ba\w*\b匹配以字母a开头的单词,先是某个单词开始\b,然后是字母a,然后是任意数量的字母或数字\w*,最后是单词结束处\b

2、^\d{5,12}$ 匹配5位到12位数字,{5,12}重复的次数不能少于5次,不能多于12次,否则都不匹配。
使用了^$,整个字符串都要用来和\d{5,12}来匹配,整个字符串必须是5到12个数字。
3、Windows\d+ 匹配Windows后面跟1个或更多数字

4、^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处。

字符转义

如果想查找元字符本身的话,比如你查找.,或者*,这时你就得使用\来取消这些字符的特殊意义,\. \*。要查找\本身,也得用\\.

例如:
deerchao\.net 匹配 deerchao.net
C:\\Windows 匹配 C:\Windows

字符类

当匹配没有预定义元字符的字符集合只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

也可以指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字。
同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。

\(?0\d{2}[) -]?\d{8} 可匹配几种格式的电话号码,(010)88886666,或022-22334455,或02912345678等。
首先是一个转义字符\(,它能出现0次或1次?,然后是一个0,后面跟着2个数字\d{2},然后是)-或空格中的一个,它出现1次或不出现?,最后是8个数字\d{8}
有个问题就是,这个也能匹配,010)12345678或(022-87654321这样的“不正确”的格式。要解决这个问题,需要用到分枝条件。

分支条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。

\d{5}-\d{4}|\d{5}这个表达式用于匹5位数字,或者用连字号间隔的9位数字。

使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位数字(以及9位数字前5位)。
因为匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。


常用正则表达式

用户名 /^[a-z0-9_-]{3,16}$/

密码  /^[a-z0-9_-]{6,18}$/

十六进制值   /^#?([a-f0-9]{6}|[a-f0-9]{3})$/

电子邮箱    /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
URL /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

IP 地址   /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

HTML 标签 /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/

Unicode编码中的汉字范围 /^[\u2E80-\u9FFF]+$/

Reference

http://deerchao.net/tutorials/regex/regex.htm
https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
http://tool.oschina.net/uploads/apidocs/jquery/regexp.html

https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容