推荐 “微信读书” 的这本《正则表达式必知必会》,零基础小白也简单易懂
在线测试工具 <——点ta
1、匹配单个字符
. 匹配【单个】除了换行符以外的字符
\ 属于元字符(在正则表达式里有着特殊含义的字符),用来进行【转义】;
[ ] 定义一个字符集合,必须匹配该集合里的字符【之一】;字符集合可以用元字符^来求非;这将把给定的字符集合强行排除在匹配操作以外——除了该字符集合里的字符,其他字符都可以被匹配。
一般来说,当在字符集合里使用的时候,像.和+这样的元字符将被解释为普通字符,不需要被转义——但转义了也没有坏处。
例:[\w.]等价于[\w\ .]
例:.a[^0-9]\.png 匹配不到 na1.png
- 连字符,如0-9,A-Z,a-z (A-z不常用,因为还有[、^等ASCII 码排在Z-a 之间的字符),字符区间的首、尾字符可以是ASCII字符表里的任意字符。但在实际工作中,最常用的字符区间还是数字字符区间和字母字符区间。- (元字符)是一个特殊的元字符,作为元字符它只能用在[ ]之间。在字符集合以外的地方,-只是一个普通字符,只能与-本身相匹配。因此,在正则表达式里,-字符不需要被转义。
例:匹配RGB值,十六进制数字(0123456789ABCDEF):#[0-9A-Fa-f]{6} 不区分大小写
\d | 匹配任何【一个】数字,等价于 [0-9] |
\D | 匹配任何非数字,等价于[^0-9] |
\w | 任何一个字母数字下划线,等价于 [0-9A-Za-z_] |
\W | 任何一个非字母数字下划线的字符,等价于 [^0-9A-Za-z_] |
\s | 匹配任何一个空白字符,等价于[\f\r\n\t\v] |
\S | 匹配任何一个非空白字符,等价于[^\f\r\n\t\v] |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
^ | 定义整个字符串开头 |
$ | 用来定义整个字符串结尾 |
( ) | 子表达式,目的是为了把那些子表达式当作一个独立元素来使用 |
| | 或运算,把位于它左边和右边的两个部分都作为一个整体来看待 |
2、匹配多个字符
+ 一次或多个次(至少一次);在给一个字符集合加上+后缀的时候,必须把+放在这个字符集合的外面。 等价于{ 1, }; —— +?是+的懒惰型版本
例:[0-9]+ 匹配连续出现的一串数字
* 零次或多次;等价于{ 0, }; —— *?是*的懒惰型版本,匹配到第一个符合条件的位置,停止
? 零次或一次; 等价于 { 0,1 };
{ n } 匹配n次; { a,b } 至少a(可以为0)次,至多b(可以不填)次; { n, }? 是 { n, }的懒惰型版本
3、向前后查找♥♥♥♥♥♥
【向前查找】:向前查找指定了一个必须匹配但不在结果中返回的模式。该模式是以?=开头的子表达式,需要匹配的文本跟在=的后面。
【向后查找】: 该模式是以?<=开头的子表达式,需要匹配的文本跟在=的后面。
例:str="<h1>abdecdef</h1>"; str.match(/(?<=\<\/h1>).+(?=\<\/h1>)/); 输出:”abdecdef“
4、示例成果
(1)匹配ip地址:((0|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}(0|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))
(2)匹配重复出现的单词:[ ]+(\w+)[ ]+