前端正则表达式浅析

今天简单来讲一讲正则,尤其是一些我们在前端开发中可能会使用到的一些内容。

匹配字符串

两种模糊匹配的方式

1.1 横向模糊匹配

横向模糊是指匹配字符串的长度是可变的。
横向匹配采用量词的方式来实现,譬如如下一个正则表达式:
/ab{1,2}c/表示的是:第一个字符是'a',然后是1个或者两个'b',最后是'c',在这个例子中,我们并不能确定他最终能匹配到的字符串的长度,可能是3个,也可能是4个,这种情况我们就称之为是横向模糊匹配。

量词的用法:
写法 含义
{m,n} 表示最少出现m次,最多出现n次。
{m,} 表示最少出现m次。
{m} 等价于{m,m},表示最少出现m次,最多出现m次,即出现m次。
? 等价于{0,1},表示出现一次或者不出现。
+ 等价于{1,},表示最少出现一次。
* 等价于{0,},表示可以出现任意次,也可以不出现。
贪婪匹配和惰性匹配

这是字符匹配的两大特性,在我们刚才那个例子中,譬如我么可以看下面这个例子,/\d{1,3}/,这里我们用到了\d代表匹配数字,这个在下文中会有提到。
现在我们去匹配123456这个字符串,得到的结果为123,因为他贪婪的特性,他会尽可能的匹配更多的字符。
而惰性匹配则与他正好相反,尽可能少的匹配结果,我们可以通过加一个问号来实现惰性匹配:/\d{1,3}?/,这样,当我们再去匹配刚才123456这个字符串的时候,他能匹配到的结果就是1

1.2 纵向模糊匹配

纵向模糊是指匹配字符串中有某一位字符不是确定字符。
纵向匹配采用字符组的方式来实现,譬如如下一个正则表达式:
/a[abc]c/可以匹配到的字符串有'aac''abc''acc'三种情况。

字符组的用法

字符组虽然叫组,但是只会取其中一个字符。
他的表示方法可以有以下几种:

  1. 普通方式
    就是前面提到过的[abc]的方式
  2. 范围表示法
    当字符组里的数据特别多,而且具有一定顺序的时候,我们就可以使用范围表示法,比如说我们要使用字符'a''m',我们就可以使用连字符-来省略和简写,[a-m]
  3. 排除法
    如果我们需要对第一种情况进行取反,比如字符可以是除了'a''b''c'以外的任何东西,我们可以使用^来取反[^abc],就像这样,我们称之为反义字符组(排除字符组)。
  4. 简写
    最后就是简写,也就是上文的例子中有用到的比如\d的写法就是简写中最为常见的一种,字符组的简写一般有以下几种:
写法 含义
\d 等价于[0-9],表示是一位数字。
\D 等价于[^0-9],表示除数字外的任何字符。
\w 等价于[0-9a-zA-Z_],表示数字,大小写字母和下划线。
\W 等价于[^0-9a-zA-Z_],表示出现一次或者不出现。
\s 等价于{1,},表示最少出现一次。
\S 等价于{0,},表示可以出现任意次,也可以不出现。
. 等价于{0,},表示可以出现任意次,也可以不出现。

分支选择

可以采用|来进行分隔,代表不同的模式
(p1|p2|p3),比如如下一个例子,/abc|123/既可以匹配abc也可以匹配123

匹配位置

在正则的匹配中,还有一种就是位置匹配,正则中的位置我们可以理解为空字符串。
'hello' = '' + 'h'+''+'e'+''+'l'+''+'l'+''+'o'+''
这里使用空字符串的位置都可以算作是位置。
关于位置的匹配总共可以有以下六种匹配的方式:

写法 含义
^ 匹配开头。
$ 匹配结尾。
\b 单词边界。
\B 和\b相反,非单词边界。
(?=p) p是一个子模式,这里代表p前面的位置。
(?!p) 就是(?=p)的反面,表示不是p的情况下的前面。

我们可以用一个例子来加深理解:

'hello world'.replace(/^/g,'$')
// $hello world

'hello world'.replace(/$/g,'$')
// hello world$

'hello world'.replace(/\b/g,'$')
// $hello$ $world$

'hello world'.replace(/\B/g,'$')
// h$e$l$l$o w$o$r$l$d

'hello world'.replace(/(?=l)/g,'$')
// he$l$lo wor$ld

'hello world'.replace(/(?!l)/g,'$')
// $h$ell$o$ $w$o$rl$d$
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。