资料
正则表达式30分钟入门教程
《JavaScript 闯关记》之正则表达式
正则表达式是什么
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
为什么要用正则表达式
- 密码、账号等验证。
- 看源码需要,写框架,后端编程,路由都离不开正则
元字符
例子加深理解
- 例子一
- 正则表达式:
\bhi\b.*\bLucy\b
- 含义:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词
- 知识点:
\b
:代表着单词的开头或结尾,也就是单词的分界处.
:匹配除了换行符以外的任意字符*
:它指定前边的内容可以连续重复使用任意次以使整个表达式得到匹配
- 例子二
- 正则表达式:
0\d\d-\d\d\d\d\d\d\d\d
或0\d{2}-\d{8}
- 含义:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字
- 知识点:
\d
:匹配一位数字{n}
:匹配必须连续重复匹配2次
- 例子三
- 正则表达式:
\ba\w*\b
- 含义:a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)
- 知识点:
\w
:匹配字母或数字或下划线或汉字等\s
:匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等(虽然这里没有)
还有一些元字符
^
:匹配匹配字符串的开始$
:匹配匹配字符串的结束{n,m}
:重复的次数不能少于n次,不能多于m次\
:标记为一个元字符、或一个原义字符、或一个 向后引用、或一个八进制转义符重复:
代码/语法 | 说明
- | -
- | 重复零次或更多次
- | 重复一次或更多次
? | 重复零次或一次
{n} | 重复n次
{n,} | 重复n次或更多次
{n,m} | 重复n到m次
字符类
匹配没有预定义元字符的字符集合 : 只需要在方括号里列出它们就行了
如:[aeiou]
就匹配任何一个英文元音字母
一些稍微高级的话题
- 分枝条件:
|
类似于编程中的或,指的是有几种规则,如果满足其中任意一种规则都应该当成匹配 - 分组:用小括号来指定子表达式
反义:
代码/语法 | 说明
- | -
\W | 匹配任意不是字母,数字,下划线,汉字的字符
\S | 匹配任意不是空白符的字符
\D | 匹配任意非数字的字符
\B | 匹配不是单词开头或结束的位置
[^x] | 匹配除了x以外的任意字符
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符
- | -
后向引用:使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号。
后向引用
用于重复搜索前面某个分组匹配的文本。例如,\1
代表分组1匹配的文本。- 零宽断言:查找在某些内容(但并不包括这些内容)之前或之后的东西。
(?=exp)
也叫零宽度正预测先行断言
,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b)
,匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing
和danc
。 - 负向零宽断言:确保某个字符没有出现,但并不想去匹配它
- 贪婪与懒惰:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)
匹配尽可能多的字符
。有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?
。 - 平衡组/递归匹配