0%

正则表达式入门

之前涉及到正则的时候全靠搜。现在记录一下,加深一下印象。
正则的语法就是两条斜线//中间是正则的主体。比如

1
/aaaa/ 匹配 aaaa

转义字符

转义字符主要作用就是

  1. 匹配不方便显示的字符如\n
  2. 在正则中预设了一些特殊意义的字符。
  3. 让特殊意义的字符显示本身。

举一些常见的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\n  换行
\r 回车
\t 制表符也就是tab
这些属于第一种,但感觉也不常用。平时开发没怎么用到

\w 匹配任何一个字母或者数字或者下划线
\W 除了\w以外的东西
\s 匹配空白字符,如空格,tab等。
\S 除了\s以外的东西
\d 0-9
\D 非数字字符
\b 匹配单词的边界
\b 匹配非单词的边界
这些就是一些常见的预设特殊意义的字符

如果你就想匹配\的话。就需要这样写
\\

字符集合

用一个中括号。表示里面的字符匹配都是或的关系。

1
2
3
[abc] a || b || c
[0-9] 可以用-表示一个范围。 表示0-9中间任意一个
[^abc] ^表示非 就是匹配abc之外的任意字符

量词

正则中量词有多个。

  1. ?匹配0次或者1次(也就是最多出现一次)
  2. + 匹配1-n次(至少出现一次)
  3. * 匹配0-n次,优先匹配n次。
  4. {n} 匹配n次。
  5. {m, n} 匹配m-n次。
  6. {m, } 匹配m到无穷次。优先匹配无穷次。

正则默认是贪婪模式,就是凡事表示范围的,优先匹配上限而不是下限。就是说它会尽可能的往多里匹配。

字符边界

  1. ^ 表示匹配开头
  2. $ 表示匹配结尾

选择表达式

123|456|789 //匹配123或456或789

分组与引用

分组的功能就是匹配一组字符,如
(abc) 就是匹配abc这个整体

捕获分组和非捕获分组

这块,知乎上有一个答案说的非常清楚。在此引用一下。

最近正在学习正则,也发现了捕获性分组和非捕获性分组,也在寻找答案。终于通过努力,研究懂了他们的区别到底在哪。我就不说术语了,直接用例子会表述的更清楚: 要在一篇文章中查找”program”和”project”两个单词,正则表达式可表示为/program|project/,也可表示为/pro(gram|ject)/,但是缓存子匹配(gramject)没有意义,就可以用/pro(?:gram|ject)/进行非捕获性匹配这样既可以简洁匹配又可不缓存无实际意义的字匹配
作者:冰冻三寸
链接:https://www.zhihu.com/question/19853431/answer/160306020
来源:知乎

预搜索

如果你想匹配xxx前不能是yyy,或者xxx后不能是yyy,那就要用到预搜索

js只支持先行预搜索,也就是xxx前面必须是yyy,或者xxx前面不能是yyy

1
2
(?=1)2 // 可以匹配12,不能匹配22
(?!1)2 // 可有匹配22,不能匹配12

修饰符

  1. g 全局修饰符,一直匹配到结束
  2. i 忽略大小写
  3. m 匹配多行文本