正则表达式学习笔记
定义
正则表达式regular expression(也称“regex”或“regexp”)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
举个例子:在平时的计算机操作中,当我们搜索一个文件时,希望找到所有的Word文档,可以在搜索栏的文件名中输入“*.doc”来匹配所有以“.doc”结尾的文件名,“*”被称为通配符,可以任意匹配字符串。正则表达式的作用就类似于这种应用。
格式
在JavaScript和php中,正则表达式是由两条斜杠“/”所包围的(Java则不用,由于正则表达式是数学概念,在不同的语言中核心语法是相似的,只是存在细微差别,这里我主要针对的是js)。
正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式,描述文本模式的表达对象。
1 | var reg01=/abc/; |
上面实例中,第二个/后面的“ig”等是匹配模式,可选。其含义分为:
- “i”为“ignore case”,即忽略大小写。
- “g”为“global search”,即全局搜索。
- “m”为“multiline search”,即多行搜索。
含义
正则表达式的两个斜杠之间的模式字符串如果为一般的字母或数字,表示直接匹配相应的字符。例如“/abcd/”匹配字符串“abcd123”中“abcd”的部分。花括号“{”等特殊字符在正则表达式中,又有其特殊的含义。下面是正则表达式中各字符的匹配含义。
一、普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
二、非打印字符
非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
三、特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如”*.txt”中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls\ *.txt。
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符 () 放在它们前面。下表列出了正则表达式中的特殊字符:
补充
四、限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
正则表达式的限定符有:
五、定位符
定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。
注意:不能将限定符与定位点一起使用。由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
实例
下面我们找几个实际的例子来分析一下,就更加明白了。
- 校验中文^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$
1
2
3
4^[\u4e00-\u9fa5]{0,}$
```
^开始[]中是要匹配的主要内容,其中的\u4e00是一个汉字的Unicode编码,而\u4e00-\u9fa5就表示所有汉字的Unicode编码,后面的{0,}表示至少匹配0次,最多不限制长度,$结束。
2. 验证身份证号(18位)^\w+([-+.]\w+)*@\w+([-.]\w+).\w+([-.]\w+)$1
2
3^开始[1-9]匹配1-9数字中的一个,\d{5}表示匹配5个0-9的数字,后面的一样体会,((0\d)|(1[0-2]))这一段是单独括出来表示年份的,|表示的或条件(左右二选一),0\d是0+一个数字,1[0-2]是1+0,1,2,中的一个,后面表示年月的类似,最后面的([0-9]|X)则是给定了身份证最后一位要么是0-9数字,要么是X,$结束正则表达式
3. 验证email地址^开始\w匹配数字字母下划线或汉字,表示匹配前面的表达式一次或多次,考虑到用户脑回路比较清奇[+-.]表示匹配其中的+-.其中一个,*匹配前面的子表达式一次或多次,后面大致相同理解,其中\\.是转义字符就表示.,$结束
这里举的例子不多,可以看看下面参考文献中的二十个常用的正则表达式
贪婪与非贪婪模式
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。
仅从应用角度分析,可以这样认为,非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配,也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,至于还有没有没捡的就不管了。
这里要更深入了解具体可看参考文献。
参考文献
正则表达式之基础语法
正则表达式30分钟入门教程(推荐必看)
Python正则表达式指南
知道这20个正则表达式,能让你少写1,000行代码
正则基础(贪婪与非贪婪模式)