(未完成) JavaScript 正则表达式笔记

各种编程语言里都有正则,可恶的是它们提供的 API 还经常不一致,这就导致了我这种记性不好的人总会记混。目前在写前端,准备彻底整理一下 JavaScript 的正则表达式。

JavaScript 的正则来自于 Perl,据说还在 Perl 正则的基础上做了一定的改进,用起来还是挺不错的,而且语法和 API 并不复杂。

正则表达式的定义

在 JavaScript 中,正则有两种创建方式:

  • 使用直接量语法创建
var patten = /[Jj]ava[Ss]cript$/;
  • 使用 RegExp() 构造函数创建。
var patten = new RegExp('[Jj]ava[Ss]cript$');

第一种方式写起来比较简单,但是有时候我们可能需要在程序运行过程中动态的将一个字符串转为正则表达式,就需要使用第二种方式了。

正则表达式语法

基本语法

  • 正则表达式是一个字符序列,大多数字符(如字母和数字)都是按照字符本身的意思进行匹配的,比如 /java/ 就可以匹配所有包含 'java' 子串的字符串。
  • 那么 JavaScript 的正则中如何来匹配一些特殊的字符呢,他们是通过反斜线()为前缀的转义字符表示的,如下表:
字符匹配
字符和数字字符自身
\oNUL 字符(u0000)
\t制表符(u0009)
\n换行符(u000A)
\v垂直制表符(u000B)
\f换页符(u000C)
\r回车符(u000D)
\xnn由十六进制数 nn 指定的拉丁字符,例如 x0A 等价于 n
\uxxxx由十六进制数 xxxx 指定的 Unicode 字符,例如 u0009 等价于 t
\cX控制字符 ^X,例如 cJ 等价于换行符 n
  • 在正则表达式中,有一些字符是有特殊含义的,它们分别是:
^  $  .  *  +  ?  =  !  :  |  \  /  (  )  [  ]  {  }

字符类

  • 在 JavaScript 正则中可以把直接量字符放到方括号里组成字符类,一个字符类可以匹配包含或者不包含它的任意一个字符。

    • /[abc]/ 可以匹配字符串 'a''b''c'
    • /[^abc] 可以匹配不包含 abc 任意一个字符的字符串,如 hello
  • 在字符类中可以使用连词符 - 表示某个范围内的字符。如 /[a-z]/ 可以匹配所有的小写字母。
  • 由于有些字符类非常常用,所以在 JavaScript 的正则语法中,可以使用特殊的转义字符表示一些字符类,如下表:
字符匹配
[...]方括号内中的任意字符
[^...]不在方括号内的任意字符
.除了换行符、回车符和其他 Unicode 终止符之外的任意字符
\w任何字母和数字字符,等价与 [a-zA-Z0-9]
\W任何不是字母和数字的字符,等价于 [^a-zA-Z0-9]
\s任何 Unicode 空白符,包括 n 和 r
\S任何非 Unicode 空白符
\d任何 ASCII 数字,等价于 [0-9]
\D除了 ASCII 数字之外的任何字符,等价于 [^0-9]
[\b]退格直接量(不明白,虽说是特例,可为什么不放在直接量里,而放到字符类里?)

可以发现,这些转义的字符类中,大写字母都是小写字母的补集。

标签: none

添加新评论