正则表达式是被用来匹配字符串中的字符组合的模式。在JavaScript中,正则表达式也是对象。这种模式可以被用于RegExp
的exec
和test
方法以及 String
的match
、replace
、search
和split
方法。
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
创建正则表达式两种方式:
正则表达式字面量
/pattern/attributes
例var re = /ab+c/;
调用RegExp
对象的构造函数,如下所示:
new RegExp(pattern, attributes);
例var re = new RegExp("ab+c");
参数
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
RegExp对象属性:
属性 | 描述 | FF | IE |
---|---|---|---|
global | RegExp 对象是否具有标志 g。 | 1 | 4 |
ignoreCase | RegExp 对象是否具有标志 i。 | 1 | 4 |
lastIndex | 一个整数,标示开始下一次匹配的字符位置。 | 1 | 4 |
multiline | RegExp 对象是否具有标志 m。 | 1 | 4 |
source | 正则表达式的源文本。 | 1 | 4 |
RegExp对象方法:
方法 | 描述 | FF | IE |
---|---|---|---|
compile | 编译正则表达式。 | 1 | 4 |
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 | 1 | 4 |
test | 检索字符串中指定的值。返回 true 或 false。 | 1 | 4 |
compile方法定义和用法,用的不多,不做过多解释:
compile() 方法用于在脚本执行过程中编译正则表达式。
compile() 方法也可用于改变和重新编译正则表达式。
exec方法定义和用法
exec() 方法用于检索字符串中的正则表达式的匹配。返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
<script type="text/javascript"> var str = "Visit W3School, W3School is a place to study web technology."; var patt = new RegExp("W3School","g"); var result;
//返回匹配到的结果 while ((result = patt.exec(str)) != null) { document.write(result); document.write("<br />"); document.write(patt.lastIndex); document.write("<br />"); } </script>
结果:W3School
14
W3School
24
test定义和用法:
test() 方法用于检测一个字符串是否匹配某个模式。匹配返回 true,否则返回 false。
RegExpObject.test(string)
例子:
<script type="text/javascript"> var str = "Visit W3School"; var patt1 = new RegExp("W3School"); var result = patt1.test(str); document.write("Result: " + result); </script>
结果 :Result: true
总结:
1.exec方法是使用正则表达式的最强大和最慢的方法。如果它成功地匹配regexp和字符串String,它会返回一个数组。数组中下标为0的元素将包含正则表达式regexp匹配的字符串。下标为1的元素是分组1捕获的文本,下标为2的元素是分组2捕获的文本,以此类推。如果匹配失败,它会返回null。
2.test方法是使用正则表达式的最简单和最快的方法。如果该regexp匹配string,它返回true;否则,它返回false。
方法 | 描述 | FF | IE |
---|---|---|---|
search | 检索与正则表达式相匹配的值。 | 1 | 4 |
match | 找到一个或多个正则表达式的匹配。 | 1 | 4 |
replace | 替换与正则表达式匹配的子串。 | 1 | 4 |
split | 把字符串分割为字符串数组。 | 1 | 4 |
1.string.search(regexp)
search方法和indexOf方法类似,只是它接收一个正则表达式对象作为参数而不是一个字符串。如果找到匹配,它返回第1个匹配的首字符位置,如果没有找到匹配,则返回-1。此方法会忽略g标识,且没有position参数。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。
注释:要执行忽略大小写的检索,请追加标志 i。
例var text = 'and in it he says "Any damn fool could'; var pos = text.search(/["']/) //结果为18
2.strng.match(regexp)和stringObject.match(searchvalue)
match方法让字符串和一个正则表达式进行匹配。它依据g标识来决定如何进行匹配。如果没有g标识,那么调用string.match(regexp)的结果与调用regexp.exec(string)的结果相同。然而,如果带有g标识,那么它生成一个包含所有匹配(除捕获组之外)的数组。
var str="Hello world ll world!" alert(str.match("world!")); //结果world console.log(str.match(/world/g)); //结果[world,world]
3.string.split(separator,limit)
split方法把这个string分割成片段来创建一个字符串数组。可选参数limit可以限制被分割的片段数量。separator参数可以是一个字符串或者一个正则表达式。
例 var digits = '0123456789'; var a = digits.split('',5); //a是['0,'1','2','3','4','5'];
4.stringObject.replace(regexp/substr,replacement)
replace方法对string进行查找和替换操作,并返回一个新的字符串。参数searchValue可以是一个字符串或者一个正则表达式对象。
参数 | 描述 |
---|---|
regexp/substr | 必需。规定子字符串或要替换的模式的 RegExp 对象。 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。 |
replacement | 必需。一个字符串值。规定了替换文本或生成替换文本的函数。 |
返回值
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
说明
字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。
字符 | 替换文本 |
---|---|
$1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$' | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |
用使用这些组号,则有个问题就是正则表达式要存在组号,关于组则相应的分组匹配自表达式,一个误区:
注意:
(...)捕获型分组,又可以叫字表达式,捕获型分组会复制它所匹配的文本,并将其放到result数组里,每个捕获分组都会被指定一个编号。
(?:)非捕获性分组,仅做简单的匹配,并不会捕获所匹配的文本,性能比捕获性分组效率高,非捕获性分组不会干扰捕获型分组的编号。
能体现replace用法的例子:
在本例中,我们将把 "Doe, John" 转换为 "John Doe" 的形式:
name = "Doe, John"; name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
在本例中,我们将把所有的花引号替换为直引号:
name = '"a", "b"'; name.replace(/"([^"]*)"/g, "'$1'");
在本例中,我们将把字符串中所有单词的首字母都转换为大写:
name = 'aaa bbb ccc'; uw=name.replace(/\b\w+\b/g, function(word){ return word.substring(0,1).toUpperCase()+word.substring(1);} );
replace两个经典例子区分其区别就能了解其用法:
例一(采用全局匹配加g也是一样的结果):
<script type="text/javascript"> name = "Doe, John,12344"; document.write(name.replace(/(\w+)\s*, \s*(\w+),\d+/, function($1,$2){return $2})); //弹出结果为John </script>
例二:
<script type="text/javascript"> name = "Doe, John"; document.write(name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1")); //结果为 John,Doe </script>
例三:
<script type="text/javascript"> name = "Doe, John,12344"; document.write(name.replace(/(\w+)\s*, \s*(\w+),\d+/, function($2){return $2})); //弹出结果为Doe, John,12344 </script>
结论,要想返回匹配的单个组元素,必须将匹配的组都作为参数。
元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,必须对这些元字符转义.下面是正则表达式用到的所有元字符
注意:正则转义,如果对特殊字符转义拿捏不准时,可以给任何特殊字符都添加一个\前缀来使其字面化,注意\前缀不能使字母或数字字面化。常见的需要转义的字符 -( [ { \ ^ $ | ) ? * + .等
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
最后补充一下正则懒惰/贪婪规则:
*?重复任意次,但尽可能少重复。
+?重复1次或更多次,但尽可能少重复。
??重复0次或1次,但尽可能少重复。
{n,m}?重复n到m次,但尽可能少重复。
{n,}?重复n次以上,但尽可能少重复。
资料来源: 正则表达式30分钟入门教程 http://deerchao.net/tutorials/regex/regex.htm
精通 JS正则表达式-Aaron http://www.cnblogs.com/aaronjs/archive/2012/06/30/2570970.html
javascript正则表达式 http://www.cnblogs.com/rubylouvre/archive/2010/03/09/1681222.html
js 常用正则表达式表单验证代码(javascript) http://www.qingdou.me/3716.html
javascript常用正则表达式汇总 http://www.zhufengpeixun.cn/jishuziliao/javaScriptzhuanti/2011-11-15/157.html
正则表达式在线工具 http://tool.lu/regex/