根据正则表达式语法规则,大部分字符仅能够描述自身,这些字符称为普通字符,如所有的字母、数字等。
元字符就是拥有特定功能的特殊字符,大部分需要加反斜杠进行标识,以便与普通字符进行区别,而少数元字符,需要加反斜杠以便转义为普通字符使用。JavaScript正则表达式支持的元字符说明如下。
- . 查找单个字符,除了换行和行结束符。
- \w 查找单词字符。
- \W 查找非单词字符。
- \d 查找数字。
- \D 查找非数字字符。
- \s 查找空白字符。
- \S 查找非空白字符。
- \b 匹配单词边界。
- \B 匹配非单词边界。
- \0 查找NUL字符。
- \n 查找换行符。
- \f 查找换页符。
- \r 查找回车符。
- \t 查找制表符。
- \v 查找垂直制表符。
- \xxx 查找以八进制数xxx规定的字符。
- \xdd 查找以十六进制数dd规定的字符。
- \uxxxx 查找以十六进制数xxxx规定的Unicode字符。
表示字符的方法有多种,除了可以直接使用字符本身外,还可以使用ASCII编码或者Unicode编码来表示。
【示例1】下面使用ASCII编码定义正则表达式直接量。
var r = /\x61/; //以ASCII编码匹配字母a var s = "JavaScript"; var a = s.match(r); //匹配第一个字符a
由于字母a的ASCII编码为97,被转换为十六进制数值后为61,因此如果要匹配字符a,就应该在前面添加“\x”前缀,以提示它为ASCII编码。
【示例2】除了十六进制外,还可以直接使用八进制数值表示字符。
var r = /\141/; //141是字母a的ASCII编码的八进制值 var s = "JavaScript"; var a = s.match(r); //即匹配第1个字符a
使用十六进制需要添加“\x”前缀,主要是避免语义混淆,但是八进制不需要添加前缀。
【示例3】ASCII编码只能够匹配有限的单字节字符,使用Unicode编码可以表示双字节字符。Unicode编码方式:“\u”前缀加上4位十六进制值。
var r = /\u0061/; //以Unicode编码匹配字母a var s = "JavaScript"; //字符串直接量 var a = s.match(r); //匹配第一个字符a
【注意】
在RegExp()构造函数中使用元字符时,应使用双斜杠。
var r = new RegExp("\\u0061");
RegExp()构造函数的参数只接受字符串,而不是字符模式。在字符串中,任何字符加反斜杠还表示字符本身,如字符串“\u”就被解释为字符u本身,所以对于“\u0061”字符串来说,在转换为字符模式时,就被解释为“u0061”,而不是“\u0061”,此时反斜杠就失去转义功能。解决方法:在字符u前面加双反斜杠。