您的位置:首页 > Web前端 > JavaScript

JavaScript正则表达式的模式匹配

2015-12-27 17:40 423 查看
正则表达式是一个描述字符模式的对象。JavaScript中的正则表达式使用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象。

1. RegExp对象通过一种特殊的直接量语法来创建。就像通过引号包裹字符的方式来定义字符串直接量一样。

例2-01:

var pattern = /s$/; // 用来匹配所有以字母 's' 结尾的字符串。

2. 直接量字符:

字符匹配
字母和数字字符 自身
\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
3. 正则表达式的字符类:

字符 匹配
[...]方括号内的任意字符
[^...]不在方括号内的任意字符
.除换行符和其他Unicode行终止符之外的任意字符
\w任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s任何Unicode空白符
\S任何非Unicode空白符的字符,注意\w和\S不同
\d任何ASCII数字,等价于[0-9]
\D除了ASCII数字之外的任何字符,等价于[^0-9]
[\b]退格直接量(特例)
4. 正则表达式的重复字符语法:

字符含义
{m, n}匹配前一项至少n次
{n, }匹配前一项n次或者更多次
{n}匹配前一项n次
?匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0, 1}
+匹配前一项1次或者多次,等价于{1, }
*匹配前一项0次或者多次,等价于{0, }
5. 非贪婪的重复:
上面的匹配字符串是尽可能的多地匹配,而且允许后续的正则表达式继续匹配。这种匹配称之为“贪婪的”匹配。我们可以通过在待匹配的字符串后面跟一个'?'即可,如“+?”,这种匹配就叫做“非贪婪的”重复匹配。

6. 选择,分组和引用:
字符 “|” 用于分隔供选择的字符串。
例2-02:
/ab|cd|ef/ //用于匹配字符“ab”,或者 “cd”,或者“ef”
* 需要注意的是: 选择项的尝试匹配次序是从左到右,直到发现匹配项。如果左边的匹配项满足匹配,就会忽略右边的匹配项。
例2-03:
/a|ab/ //如果使用当前的正则表达式来匹配字符串“ab”的话,它只能匹配第一个字符。

在正则表达式中“( )”有多种作用。可以把单独的项组合成子表达式。也可以在完整的模式中定义子模式。
例2-04:
/(ab|cd)+|ef/ //可以匹配字符串“ef”,也可以匹配字符串“ab”或者“cd”的一次或多次重复。

带圆括号的表达式的一个用途是允许在同一正则表达式的后部引用前面的子表达式。可以通过在字符"\"后面加一位或者多位数字来实现。这个数字指定了带圆括号的子表达式在正则表达式中的位置。
例2-05:
/([Jj]ava[Ss]cript?)\sis\s(fun\w*)/ //在这个正则表达式中,子嵌套表达式([Ss]cript)可以使用\2来代替

字符含义
|选择,匹配的是该符号左边的子表达式或右边的子表达式
(...)组合,将几个项组合为一个单元,这个单元可以通过“*”、“+”、“?”和“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?:...)只组合,把项组合到一个单元,但不记忆与该组相匹配的字符
\n和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码
7. 指定匹配位置:
正则表达式中的多个元素才能够匹配字符串的一个字符。还有一些正则表达式的元素匹配的是字符之间的位置,而不是实际的字符。例如, \b匹配一个单词的边界,即位于\w和\W之间的边界,或是位于一个ASCII单词与字符串的开始或结尾的边界。像\b这种的元素不匹配某个可见的字符,它们指定匹配发生的合法位置。这种元素就叫做正则表达式的锚。

正则表达式中的锚

字符含义
^匹配字符串的开头,在多行检索中,匹配一行的开头
$匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b匹配一个单词的边界
\B匹配非单词边界的位置
(?=p)零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p)零宽负向先行断言,要求接下来的字符不与p匹配
8. 正则表达式中的修饰符:
正则表达式中的修饰符是用以说明高级匹配模式的规则。修饰符是放在“/”符号之外的,也就是说,它们不是出现在两条斜线之间,而是出现在第二条斜线之后。

字符含义
i执行不区分大小写的匹配
g执行一个全局匹配,就是找到所有的匹配,而不是在找到一个匹配之后就停止
m多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束
9. 用于模式匹配的String方法:
String支持4种使用正则表达式的方法,最简单的是search()。它的参数是一个正则表达式,返回一个与之匹配的子串的起始位置,如果找不到将返回 -1。如果search的第一个参数不是正则表达式,则会先通过RegExp构造函数将它转换为正则表达式。search()方法不支持全局检索,因为它忽略正则表达式参数中的修饰符g。

例2-06:
"JavaScript".search(/script/i); // 返回4

replace()方法用以检索和替换操作。第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。如果带g将替换所有的符合要求的字符串,不带g,将只替换第一个字符串。如果第一个参数不是正则表达式,则replace()方法将直接搜索这个字符串。replace()方法的第二个参数可以是函数。

例2-07:
text.replace(/javascript/gi, "JavaScript"); //将所有不区分大小写的javascript都替换为大小写正确的JavaScript

match()方法是最常用的String正则表达式方法。它的唯一的参数就是一个正则表达式(或通过RegExp()构造函数将其转换为正则表达式),返回的是一个由匹配结果组成的数组。

例2-08:
"1 plus 2 equals 3".match(/\d+/g) ; //返回["1", "2", "3"]

String对象最后一个和正则表达式有关的方法是split()。split()方法的参数是可以是一个正则表达式。

例2-09:
"1, 2, 3, 4, 5".split(/\s*,\s*/); //返回["1", "2", "3", "4", "5"]

10. RegExp对象:
正则表达式是通过RegExp对象来表示的。除了RegExp()构造函数之外,RegExp对象还支持3个方法和属性。RegExp()构造函数带有两个字符串参数,其中第二个参数是可选的,第一个参数包含正则表达式的主体部分,也就是正则表达式直接量中两个“/"之间的文本。注意:不论是字符串直接量还是正则表达式,都使用"\"字符作为转义字符的前缀,因此当给RegExp()传入一个字符串表述的正则表达式时,必须将"\"替换成"\\"。第二个参数可选,但是只能传入"i",
"g","m"或者它们的组合。

例2-10:

var zipcode = new RegExp("\\d{5}", "g"); //全局匹配字符串中的5个数字,注意"\\", 结果:/\d{5}/g

RegExp属性:

source是一个只读字符串,包含正则表达式的文本
global只读的布尔值,用以说明这个正则表达式是否带有修饰符g
ignoreCase只读的布尔值,用以说明这个正则表达收是否带有修饰符i
multiline只读的布尔值,用以说明这个正则表达式是否带有修饰符m
lastIndex可读/写的整数。如果匹配模式带有修饰符g,这个属性存储在整个字符串中下一次检索的开始位置。
11. RegExp方法:
RegExp对象定义了两个用于执行模式匹配操作的方法。最主要的执行模式匹配的方法是exex(), 与String方法match相似。exec()方法对一个指定的字符串执行一个正则表达式。如果没有找到任何匹配,它就返回null,如果找到了一个匹配,就返回一个数组。这个数组的第一个元素包含的是与正则表达式相匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的子串。

exec()方法:

例2-11:
var pattern = /Java/g;

var text = 'JavaScript is more fun than Java';

var result;

while((result = pattern.exec(text)) != null){

console.log("Matched: " + result[0] + " at position " + result.index + " ; next search begins at " + pattern.lastIndex);

}

结果:

Matched: Java at position 0 ; next search begins at 4

Matched: Java at position 28 ; next search begins at 32

另外一个RegExp方法是test(), 它的参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配的结果,则返回true.

test()方法:

例2-12:
var pattern = /java/i;
pattern.test("JavaScript");

结果:
返回 true.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: