正则表达式经常被简称为模式,它们其实是一些由字符构成的字符串。正则使用的场景,不外乎两种情况:一种是查找特定的信息(搜索),另一种是查找并编辑特定的信息(替换)。给定一个正则表达式,它要么匹配一些文本(进行一次搜索),要么匹配并替换一些文本(进行一次替换)。
匹配单个字符
1、
.
字符可以匹配任何一个单个的字符。2、
\
是一个元字符,\
字符永远出现在一个有着特殊含义的字符序列的开头,这个序列可以由一个或多个字符构成。
匹配一组字符
1、使用
[和]
定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。
利用[Rr]eg[Ee]x
能够匹配出regex、Regex、regEx、Regex。-
2、字符集合区间
- [0-9] 等价于 [0123456789] ,匹配一个数字。
- A-Z,匹配从A到Z的所有大写字母。
- a-z,匹配从a到z的所有小写字母。
- A-F,匹配从A到F的所有大写字母。
3、取非匹配。使用
^
字符来表明你想对一个字符集合进行取非匹配。它的作用是除了那个字符集合里的字符,其他字符都可以匹配。
比如:[^0-9]可以匹配一个任何不是数字的字符。
注意:
1、在定义字符区间时,一定要避免让这个区间的尾字符小于它的首字符(例如[3-1])。这种区间没有意义,而且往往会让整个模式失效。
2、
-(连字符)是一个特殊的元字符,作为元字符它只能用在[和]之间。在字符集以外,-是普通字符,只与自身匹配。
使用元字符
元字符是一些在正则表达式里有着特殊含义的字符。英文句号(.)、左方括号[、右方括号]等都是元字符。如果不对元字符进行转义,那么我们就无法匹配到像以上几个元字符的本身,这就是我们需要转义的原因。
1、对特殊字符进行转义。转义符号前面提到过,是
\
。任何一个元字符都可以通过给它加上一个反斜杠字符作为前缀的方法来转移。
配对的元字符不用做元字符时必须被转义,否则系统会抛出异常。
2、常用元字符
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配一个数字
\b 匹配单词的开始或结束
^ 匹配行的开始
$ 匹配行的结束3、常用反义元字符
代码 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
- 4、常用重复限定符
代码 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
重复匹配
1、+ 匹配一个或多个字符。
要想匹配同一个字符(或字符集)的多次重复,只要简单的给这个字符(字符集)加上一个+
字符作为后缀就行了。+匹配一个多多个字符(至少一个字符,不包括零个字符的情况。)2、一般来说,当在字符集合里使用元字符时,像
.
和+
这样的元字符将被解释为普通字符,不需要被转义,但是转义了也没有坏处,也不会出错,效果是一样的。3、
*
匹配零个或多个字符。*
的用法和+
完全一样,区别是*匹配的是零个或多个字符。4、? 匹配零个或一个字符。这也是一个比较常用的元字符是
?
。-
5、匹配的重复次数。
- 为匹配的次数设定一个重复的值。在字符或字符集后面加上{3},意思是重复匹配三次。
- 为重复匹配次数设定一个区间。在字符或字符集后面加上{2,4},意思是重复匹配二到四次。
- 匹配至少重复多少次。在字符或字符集后面加上{3,},意思是至少重复三次,与之等价的说法是,“必须重复三次或更多次。”
匹配位置
1、
\b
来匹配单词的开始或结尾。通过\b,我们可以设置要匹配单词的边界,避免过度匹配。\b只匹配一个位置,不匹配任何字符。2、字符串边界。字符串边界有两个,一个是用来定义字符串开头的
^
,一个是用来定义字符串结束的$
。
使用子表达式
1、子表达式(),就是用()把表达式括起来,构成独立元素要使用。比如,( ){2,}。
2、如有必要,子表达式还可以嵌套。
回溯引用:前后一致匹配
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。
-
1、回溯引用匹配
- 如:
[ ] +(\w+)+[ ]+\1
。 \1代表什么?它代表模式里的第一个字表达式;\2就代表模式里的第二个字表达式,\3代表第三个,依次类推。 - 回溯引用匹配通常从1开始计数。在许多实现里,第0个匹配\0可以用来代表整个正则表达式。
- 但是这种子表达有很大的缺点,如果匹配的子表达式位置发生了变化,这就将导致整个匹配的失败。
- 回溯用法在不同的正则表达式实现里有很大的差异:javascript用户需要用$来代替\。
- 如:
-
2、大小写转换
用力进行大小写转换的元字符- \E 结束\L或\U转换
- \l 把下一个字符转换为小写
- \L 把\L到\E之间的字符全部转换为小写
- \u 把下一个字符转换为大写
- \U 把\L到\E之间的字符全部转换为大写
前后查找
1、向前查找
以?=
开头,需要匹配的文本跟在=的后面。在向前查找中,被匹配的文本不包含在最终返回的匹配结果中。2、向后查找
以?<=
开头,向后查找模式只能是固定长度,而向前查找模式的长度是可变的。3、把向前查找和向后查找结合起来。
向前查找和向后查找可以组合在一起使用。
//文本
<head>
<title>Ben Forta's Homepage</title>
</head>
//正则表达式
<?<=\<[tT][iI][tT][lL][eE]>).*<?=\</[tT][iI][tT][lL][eE]>).*
//结果
Ben Forta's Homepage
- 4、对前后查找取非
- (?=) 正向前查找。将向前查找与给定模式相匹配的文本。
- (?!) 负向前查找。将向前查找不与给定模式相匹配的文本。
- (?<=) 正向后查找。将向后查找与给定模式相匹配的文本。
- (?<!) 负向后查找。将向后查找不与给定模式相匹配的文本。
常见问题的正则表达式解决方案
1、中国固定电话号码。对应的正则表达式可以写为:
\(?0[1-9]\d{1,3}\)?[-]?[2-9]\d{2,3}[-]?\d{4}
2、北美电话号码。
\(?[2-9\d\d\)]?[ -]?[2-9]\d\d-\d{4}
稍微改改就能匹配北美电话的其他格式。3、IP地址
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
这个模式只做到了匹配合法的IP,不匹配不合法的IP。4、URL地址
简单的情况下,你的URL匹配模式至少应该匹配到以下内容:协议名(http或https)、一个主机名、一个可选的端口号、一个文件路径。正则表达式匹配如下:
http?://[-\w.]+(:\d+)?(/[\w/_.]*)?)?
5、完整的URL地址
它还可以匹配URL查询字符串(嵌在URL地址里的变量信息,这些信息与URL地址中的网址部分要用一个?隔开)以及可选的用户登录信息。
https?://(\w*:\w@)?[-\w.]+(:\d+)?(/([\w/_.]*(\?\S+)?)?)?
这个比较完备,但处理速度比较慢,没有必要的时候,建议不用。6、电子邮件地址
(\w+\.)*\w+@(\w+\.)+[A-Za-z]+
7、HTML注释
<!-{2,}.*?-{2,}>
8、JavaScript注释
.*
9、使用正则表达式验证邮箱格式
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
var email = "example@qq.com";
console.log(reg.test(email)); // true
- 10、写一个function,清除字符串前后的空格。(兼容所有浏览器)
function trim(str) {
if (str && typeof str === "string") {
return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符
}
}