正则表达式
什么是正则表达式?
正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)。
正则表达式是一种文本模式,包括普通字符(例如,a - z 的字母或是 0 - 9 的数字)和特殊字符(称为"元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
为了更好地去理解正则表达式,先来个简单的例子:
^[0-9]+abc$
^
为输入字符串的开始位置[0-9]+
匹配多个数字,[0-9]
匹配单个数字,+
匹配一个或是多个abc
匹配字母 abc$
为输入字符串的结束位置
为何使用正则表达式?
典型的搜索和替换操作会要求我们提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,将变得很困难。
正则表达式,可以:
- 测试字符串内的模式,即进行数据验证。
- 替换文本。
- 基于模式匹配从字符串中提取子字符串。
RE - 语法
语法:正则字面量表达方式:/正则表达式主体/修饰符(可选)
1、普通字符
字符 | 描述 |
---|---|
[…] | 匹配 […] 中的所有字符 |
[^…] | 匹配除了 […] 中字符的所有字符 |
[A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母 |
[0-9] | [0-9] 表示一个区间,匹配所有所有数字,等价于 \d 或是 \D |
. | 匹配除换行符(\n、\r)之外的任意单个字符,相等于[^\n\r] |
[\s\S] | 匹配所有;\s 是匹配所有空白符(包括换行),\S 非空白符(包括换行) |
\w | 匹配字母、数字、下划线。等价于 [0-9A-Za-z_] |
2、非打印字符
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。x 的值必须为 A-Z 或 a-z 之一。否则将 c 视为一个原义的 ‘c’ 字符 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ |
\r | 匹配一个回车符。等价于 \x0d 和 \cM |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
\t | 匹配一个制表符。等价于 \x09 和 \cI |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
3、特殊字符
若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符
\
放在它们前面。
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。若要匹配 $ 字符本身,请使用 \$ |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
. | 匹配除换行符 \n 之外的任何单字符 |
[ | 标记一个中括号表达式的开始 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符 |
^ | 匹配输入字符串的开始位置 |
在方括号表达式中使用时,表示非或除外该方括号表达式中的字符集合 | |
{ | 标记限定符表达式的开始 |
| | 指明两项之间的一个选择 |
4、限定符
限定符用来指定正则表达式的一个给定字符必须要出现多少次才能满足匹配
限定字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。* 等价于 {0,} |
+ | 匹配前面的子表达式一次或多次。+ 等价于 {1,} |
? | 匹配前面的子表达式零次或一次。? 等价于 {0,1} |
{n} | n 为非负整数,匹配确定的 n 次 |
{n,} | n 为非负整数,至少匹配n 次。{1,} 等价于 +,{0,} 则等价于 * |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次 |
*
和 +
限定符都是贪婪的,它们会尽可能多的匹配文字,只有在它们的后面加上一个 ?
就可以实现非贪婪或最小匹配。**
5、定位符
定位字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,同上 |
\b | 匹配一个单词边界,即字与空格间的位置 |
\B | 非单词边界匹配 |
注意:能将限定符与定位符一起使用。(在紧靠换行或者单词边界的前面或后面不能有一个以上位置)
RE - 修饰符
标记不写在正则表达式里,标记位于表达式之外
修饰符 | 描述 |
---|---|
i | ignore - 不区分大小写。搜索时不区分大小写: A 和 a 没有区别 |
g | global - 全局匹配。查找所有的匹配项 |
m | more - 多行匹配 |
s | 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n |
运算符优先级
正则表达式从左到右进行计算
运算符 | 描述 |
---|---|
\ | 转义字符 |
(),(? :),(?=),[] | 圆括号和方括号 |
*, +,?,{n},{n,},{n,m} | 限定符 |
^,$,\任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,“或” 操作 |
匹配规则
我们一般用正则表达式来验证用户的输入。当用户提交一个form表单后,要判断输入的用户名、密码、电话号码、地址、email地址、信用卡号码等是否有效。
1、匹配单字符
[a-z] //匹配所有的小写字母
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符
2、匹配双字符
^[a-z][0-9]$ //匹配一个由一个小写字母和一位数字组成的字符串
^[^0-9][0-9]$ //匹配第一个字符不能是数字的字符串
3、排除特定字符
[^a-z] //除了小写字母以外的所有字符
[^\\\/\^] //除了(\)(/)(^)之外的所有字符
[^\"\'] //除了双引号(")和单引号(')之外的所有字符
4、匹配多个字符或数字( {}
的用法)
^[a-zA-Z0-9_]{1,}$ // 所有包含一个以上的字母、数字或下划线的字符串
^[1-9][0-9]{0,}$ // 所有的正整数
^\-{0,1}[0-9]{1,}$ // 所有的整数
^[-]?[0-9]+\.?[0-9]+$ // 所有的浮点数
等价于
^[a-zA-Z0-9_]+$
^[1-9][0-9]*$
^\-?[0-9]+$
^[-]?[0-9]+(\.[0-9]+)?$
⇲ 常用正则表达式(见参考地址)
- 校验数字的表达式
- 校验字符的表达式
- 特殊需求表达式
参考地址:正则表达式 - 在线测试及代码生成工具