元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符 |
\w | 查找单词字符 |
\W | 查找非单词字符 |
\d | 查找数字 |
\D | 查找非数字字符 |
\s | 查找空白字符 |
\S | 查找非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\0 | 查找 NUL字符 |
\n | 查找换行符 |
\f | 查找换页符 |
\r | 查找回车符 |
\t | 查找制表符 |
\v | 查找垂直制表符 |
\xxx | 查找以八进制数 xxxx 规定的字符 |
\xdd | 查找以十六进制数 dd 规定的字符 |
\uxxxx | 查找以十六进制 xxxx规定的 Unicode 字符 |
var r = /\x61/; var s = "JavaScript"; var a = s.match(s);由于字母 a 的 ASCII 编码为 97,被转换为十六进制数值后为 61,因此如果要匹配字符 a,就应该在前面添加“\x”前缀,以提示它为 ASCII 编码。
var r = /\141/; var s = "JavaScript"; var a = s.match(r);使用十六进制需要添加“\x”前缀,主要是为了避免语义混淆,而八进制则不需要添加前缀。
var r = "/\u0061/"; var s = "JavaScript"; var a = s.match(s);
var r = new RegExp("\\u0061");RegExp() 构造函数的参数只接受字符串,而不是字符模式。在字符串中,任何字符加反斜杠还表示字符本身,如字符串“\u”就被解释为 u 本身,所以对于“\u0061”字符串来说,在转换为字符模式时,就被解释为“u0061”,而不是“\u0061”,此时反斜杠就失去转义功能。解决方法:在字符 u 前面加双反斜杠。
~
表示。如果在方括号内添加脱字符^
前缀,还可以表示范围之外的字符。例如:
var r = /[\u0000-\u00ff]/g;如果匹配任意双字节的汉字:
var r = /[^\u0000-\u00ff]/g;如果匹配任意大小写字母和数字:
var r = /[a-zA-Z0-9]/g;使用 Unicode 编码设计,匹配数字:
var r = /[\u0030-\u0039]/g;使用下面字符模式可以匹配任意大写字母:
var r = /[\u0041-\u004A]/g;使用下面字符模式可以匹配任意小写字母:
var r = /[\u0061-\u007A]/g;
var s = "abcdez"; //字符串直接量 var r = /[abce-z]/g; //字符a、b、c,以及从e~z之间的任意字符 var a = s.match(r); //返回数组["a","b","c","e","z"]
var r = /[0-9]/g;
var s = "abc4 abd6 abe3 abf1 abg7"; //字符串直接量 var r = /ab[c-g][1-7]/g; //前两个字符为ab,第三个字符为从c到g,第四个字符为1~7的任意数字 var a = s.match(r); //返回数组["abc4","abd6","abe3","abf1","abg7"]
var r = /[^0123456789]/g;在这个正则表达式中,将会匹配除了数字以外任意的字符。反义字符类比简单字符类的功能更强大和实用。
|
描述,表示在两个子模式的匹配结果中任选一个。例如:var r = /\w+|\d+/;2) 可以定义多重选择模式。设计方法:在多个子模式之间加入选择操作符。
var r = /(abc)|(efg)|(123)|(456)/;为了避免歧义,应该为选择操作的多个子模式加上小括号。
var s = '<meta charset="utf-8">'; //待过滤的表单提交信息 var r = /\'|\"|\<|\>/gi; //过滤敏感字符的正则表达式 function f() { //替换函数 ////把敏感字符替换为对应的网页显示的编码格式 return "&#" + arguments[0].charCodeAt(0) + ";"; } var a =s.replace(r,f); //执行过滤替换 document.write(a); //在网页中显示正常的字符信息 console.log(a);显示结果如下:
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串 |
n* | 匹配任何包含零个或多个 n 的字符串 |
n? | 匹配任何包含零个或一个 n 的字符串 |
n{x} | 匹配包含 x 个 n 的序列的字符串 |
n{x,y} | 匹配包含最少 x 个、最多 y 个 n 的序列的字符串 |
n{x,} | 匹配包含至少 x 个 n 的序列的字符串 |
var s = "ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r = /go?gle/g; var a = s.match(r);量词
?
表示前面字符或子表达式为可有可无,等效于:
var r = /go{0,1}gle/g; var a = s.match(r);
var r = /go{3}gle/g; var a = s.match(r);等效于:
var r = /gooogle/g; var a = s.match(r);
var r = /go{3,5}gle/g; var a = s.match(r);
var r = /go*gle/g; var a = s.match(r);量词
*
表示前面字符或表达式可以不出现,或者重复出现任意多次。等效于:
var r = /go(0,)gle/g; var a = s.match(r);
var r = /go+gle/g; var a = s.match(r);量词
+
表示前面字符或子表达式至少出现 1 次,最多重复次数不限。等效于:
var r = /go{1,}gle/g; var a = s.match(r);
var s = "<html><head><title></title></head><body></body></html>"; var r = /(<.*>)(<.*>)/ var a = s.match(r); //左侧表达式匹配"<html><head><title></title></head><body></body></html>" console.log(a[1]); console.log(a[2]); //右侧表达式匹配“</html>”与贪婪匹配相反,惰性匹配将遵循另一种算法:在满足条件的前提下,尽可能少的匹配字符。定义惰性匹配的方法:在重复类量词后面添加问号?限制词。贪婪匹配体现了最大化匹配原则,惰性匹配则体现最小化匹配原则。
var s = "<html><head><title></title></head><body></body></html>"; var r = /<.*?>/ var a = s.match(r); //返回单个元素数组["<html>"]在上面示例中,对于正则表达式 /<.*?>/ 来说,它可以返回匹配字符串 "<>",但是为了能够确保匹配条件成立,在执行中还是匹配了带有 4 个字符的字符串“html”。惰性取值不能够以违反模式限定的条件而返回,除非没有找到符合条件的字符串,否则必须满足它。
量词 | 说明 |
---|---|
^ | 匹配开头,在多行检测中,会匹配一行的开头 |
$ | 匹配结尾,在多行检测中,会匹配一行的结尾 |
var s = "how are you"1) 匹配最后一个单词
var r = /\w+$/; var a = s.match(r); //返回数组["you"]2) 匹配第一个单词
var r = /^\w+/; var a = s.match(r); //返回数组["how"]3) 匹配每一个单词
var r = /\w+/g; var a = s.match(r); //返回数组["how","are","you"]
匹配模式 (?= 匹配条件)
声明包含在小括号内,它不是分组,因此作为子表达式。var s = "one : 1; two : 2"; var r = /\w*(?==)/; //使用正前向声明,指定执行匹配必须满足的条件 var a = s.match(r); //返回数组["two"]在上面示例中,通过
?==
锚定条件,指定只有在 \w* 所能够匹配的字符后面跟随一个等号字符,才能够执行 \w* 匹配。所以,最后匹配的字符串“two”,而不是字符串“one”。
匹配模式(?! 匹配条件)
var s = "one : 1; two : 2"; var r = /\w*(?!=)/; //使用正前向声明,指定执行匹配不必满足的条件 var a = s.match(r); //返回数组["one"]在上面示例中,通过
?!=
锚定条件,指定只有在“\w*”所能够匹配的字符后面不跟随一个等号字符,才能够执行 \w*匹配。所以,最后匹配的是字符串“one”,而不是字符串“two”。
var s = "ab=21, bc=45, cd=43"; var r = /(\w+)=(\d*)/g; while (a = r.exec(s)) { console.log(a); //返回类似["ab=21","bc=45","cd=43"]三个数组 }
\+ 数字
数字指定了子表达式在字符模式中的顺序。如“\1”引用的是第 1 个子表达式,“\2”引用的是第 2 个子表达式。var s = "<h1>title<h1><p>text<p>"; var r = /(<\/?\w+>)\1/g; var a = s.match(r); //返回数组["<h1>title<h1>","<p>text<p>"]
var s = "abc"; var r = /(a(b(c)))/; var a = s.match(r); //返回数组["abc","abc","bc","c"]在这个模式中,共产生了 3 个反向引用,第一个是“(a(b(c)))”,第二个是“(b(c))”,第三个是“(C)”。它们引用的匹配文本分别是字符串“abc”、“bc”和“c”。
var s = "<h1>title</h1><p>text</p>"; var r = /((<\/?\w+>).*(<\/?\w+>))/g; var a = s.match(r); //返回数组["<h1>title</h1>","<p>text</p>"]
var s = "abcdefghijklmn"; var r = /(\w)(\w)(\w)/; r.test(s); console.log(RegExp.$1); //返回第1个子表达式匹配的字符a console.log(RegExp.$2); //返回第2个子表达式匹配的字符b console.log(RegExp.$3); //返回第3个子表达式匹配的字符c通过上面示例可以看到,正则表达式执行匹配检测后,所有子表达式匹配的文本都被分组存储在 RegExp() 构造函数的属性内,通过前缀符号
$
与正则表达式中子表达式的编号来引用这些临时属性。其中属性 $1 标识符指向第 1 个值引用,属性 $2 标识符指向第 2 个值引用。
var s = "abcbcacba"; var r = /(\w)(\w)(\w)\2\3\1\3\2\1/; var b = r.test(s); //验证正则表达式是否匹配该字符串 console.log(b); //返回true在上面示例的正则表达式中,“\1”表示对第 1 个反向引用 (\w) 所匹配的字符 a 进行引用,“\2”表示对第 2 个反向引用 (\w) 所匹配的字符串 b 进行引用,“\3”表示对第 3 个反向引用 (\w) 所匹配的字符 c 进行引用。
var s = "aa11bb22c3d4e5f6"; var r = /(\w+?)(\d+)/g; var b = s.replace(r,"$2$1"); console.log(b); //返回字符串“aa11bb22c3 d4e5f6”在上面例子中,正则表达式包括两个分组,第 1 个分组匹配任意连续的字母,第 2 个分组匹配任意连续的数字。在 replace() 方法的第 2 个参数中,$1 表示对正则表达式中第 1 个子表达式匹配文本的引用,而 $2 表示对正则表达式中第 2 个子表达式匹配文本的引用,通过颠倒 $1 和 $2 标识符的位置,即可实现字符串的颠倒来替换原字符串。
var s1 = "abc"; var r = /(?:\w*?)|(?:\d*?)/; var a = r.test(si);非引用型分组必须使用子表达式,但是又不希望存储无用的匹配信息,或者希望提高匹配速度来说,是非常重用的方法。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有