正则表达式(Regular Expression)是一种字符串匹配的模式,包括普通字符和特殊字符(称为"元字符"),可以用来检查串中是否含有某个子串,替换匹配的子串或取出符合条件的子串等。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
下面来举个简单的例子:
^[0-9]+abc$,该正则表达式中的^是匹配输入字符串的开始位置;[0-9]+表示匹配多个数字,其中+表示匹配一个或多个;abc表示匹配字母abc,是结束位置;abc\表示以abc结尾。
我们在不同的网站注册账号时,通常会要求输入的用户名只能包含字符、数字、下划线和连接符(-),并限定用户名长度,那么这种需求是否可以利用正则表达式来实现呢?答案是肯定的。
构造一个正则表达是用多种元字符和运算符将小的表达式结合在一起来创建一个大的表达式。正则表达式的组件可以是单个字符、字符集合、字符范围、字符间的选择或所有这些组件的任意组合。
普通字符
普通字符指没有显式指定为元字符的所有可打印和不可打印字符,包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
| 字符 | 描述 |
|---|---|
| [ABC] | 在待匹配文本中匹配中括号内所有出现的字符,如 [aeiou] 匹配字符串 "google facebook taobao"。 |
| [^ABC] | 在待匹配文本中匹配中括号内所有未出现的字符,如 [^aeiou] 匹配字符串 "google facebook taobao"中除了a e i o u外的所有字母。 |
| [A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
| . | 匹配除换行符(\n、\r)之外的任何单个字符。 |
| [\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。 |
| \w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
非打印字符
非打印字符也可以是正则表达式的组成部分。
| 字符 | 描述 |
|---|---|
| \f | 匹配一个换页符。 |
| \n | 匹配一个换行符。 |
| \r | 匹配一个回车符。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等等。 |
| \S | 匹配任何非空白字符。 |
| \t | 匹配一个制表符。 |
| \v | 匹配一个垂直制表符。 |
特殊字符
特殊字符是指一些有特殊含义的字符。如,查找字符串中的* ,需要对* 进行转义,在其前加一个\
| 特别字符 | 描述 |
|---|---|
| $ | 匹配输入字符串的结尾位置。如果要匹配 $ 字符本身,需要在其前加\ |
| ( ) | 标记子表达式的开始和结束位置。 |
| * | 匹配前面的子表达式零次或多次。 |
| + | 匹配前面的子表达式一次或多次。 |
| . | 匹配除换行符 \n 之外的任何单字符。 |
| [ | 标记一个中括号表达式的开始。 |
| ? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 |
| 匹配输入字符串的开始位置。 | |
| { | 标记限定符表达式的开始。 |
| | | 指明两项之间的一个选择。 |
限定符
限定符表示正则表达式的一个给定组件(字符/表达式)必须要出现多少次才能满足匹配。有 * 、 + 、 ? 、 {n} 、 {n,} 、 {n,m} 共6种。
| 字符 | 描述 |
|---|---|
| * | 匹配前面的子表达式零次或多次。 |
| + | 匹配前面的子表达式一次或多次。 |
| ? | 匹配前面的子表达式零次或一次。 |
| {n} | 匹配确定的n次(n>=1)。 |
| {n,} | 至少匹配n次(n>=1)。 |
| {n,m} | 最少匹配 n 次且最多匹配 m 次(m和n均为非负整数,其中n<=m) |
子表达式
使用 () 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以看成一个字符,且使用*等元字符。子表达式可以嵌套。如:(ab){2,} 匹配ababab
[] 定义一个字符集合;- 只有在 [ ] 之间才是元字符,在 [ ] 之外是普通字符;
用连字号可以表示一个字符的范围,如:
| [a-z] | 匹配所有的小写字母 |
|---|---|
| [A-Z] | 匹配所有的大写字母 |
| [a-zA-Z] | 匹配所有的字母 |
| [0-9] | 匹配所有的数字 |
| [0-9.-] | 匹配所有的数字,句号和减号 |
| [ \f\r\t\n] | 匹配所有的白字符 |
| [^a-z] | 除了小写字母以外的所有字符 |
| [^\/^] | 除了()(/)(^)之外的所有字符 |
| [^"'] | 除了双引号(")和单引号(')之外的所有字符 |
常用正则表达式
一、 校验数字的表达式
数字:^[0-9]*$
n位的数字:^\d{n} ,其中\d匹配一个数字字符,等价于[0-9]
至少n位的数字:^\d{n,}
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9] [0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(-)?\d+(\ .\d{1,2})$
正数、负数和小数:^(\-| \+)?\d+(\.\d+)?$
二、 校验字符的表达式
英文和数字:^[A-Za-z0-9]+$
长度为3-20的所有字符:^.{3,20}$
由26个英文字母组成的字符串:^[A-Za-z]+$
由26个大写英文字母组成的字符串:^[A-Z]+$
由26个小写英文字母组成的字符串:^[a-z]+$
由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
\w 匹配字母、数字、下划线。等价于[A-Za-z0-9_]
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$