特殊的标点
^ $ . * + = ! : | / ( ) [ ] { }
此处列有14个;若想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀’’,这是一条通行规则。ps:如果不记得哪些标点符号需要进行转义,可以在每个标点前都加上反斜线。
字符串类
字符 |
含义 |
[] |
匹配方括号内的任意字符串 |
[^] |
匹配不在方括号内的任意字符串 |
. |
除换行符和Unicode终止符以外的任意字符 |
w |
匹配任意ASCII字符组成的字符串,等价于[a-zA-Z] |
W |
匹配任意非ASCII字符组成的字符串,等价于[^a-zA-Z] |
s |
匹配任何Unicode空白符 |
S |
匹配任何非Unicode空白符 |
d |
匹配任何ASCII数字 |
D |
匹配任何非ASCII数字 |
[b] |
退格直接量 |
重复
字符 |
含义 |
{n,m} |
匹配前一项至少n次,至多m次 |
{n,} |
匹配前一项至少n次 |
{n} |
匹配前一项n次 |
? |
匹配前一项0次或1次 |
+ |
匹配前一项至少1次 |
* |
匹配前一项0次或多次 |
贪婪模式与非贪婪模式
在默认情况下,上表列出的重复匹配是尽可能多的匹配,即贪婪模式,eg:待匹配字符串”aaa”,使用/a+/则会匹配全部三个字符;若要使用非贪婪模式,则需在待匹配的字符后加一个’?’即可,eg:还是前一个例子,使用/a+?/进行匹配,则只会匹配第一个’a’。针对? + *
的非贪婪写法?? +? *?
,{1,5}?等价于{1}。
选择,分组与引用
在正则表达式中,字符’|’用于表示分割供选择的字符。eg:/d{3}|[a-z]{4}/用于匹配3个数字活着4个小写字母。但是要注意的是,匹配是从左往右的,倘若发现匹配项便会忽略后面的。
在政治表达式中()圆括号有多种用途:
a.把单独的项组合成子表达式,以便可以像处理一个独立的单元那样使用。
b.在完整的模式中定义子模式,当一个正则表达式成功和一个字符串进行匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分。
c.允许在同一个正则表达式后部引用前面的子表达式,通过在’’后添加数字来实现,eg:1表示引用第一个带圆括号的子表达式匹配的文本,注意!是匹配的文本不是表达式。另外,不能在字符类中使用这种引用。
(…)捕获型引用与(?: …)非捕获型引用,使用(?: …)进行分组的表达式不生成引用,即不被’1’等形式引用。
指定匹配的位置
字符 |
含义 |
^ |
匹配字符串的开头,在多行匹配中,匹配一行的开头 |
$ |
匹配字符串的结尾,在多行匹配中,匹配一行的结尾 |
b |
匹配一个单词的边界 |
B |
匹配非单词边界的位置 |
(?=p) |
零宽正向先行断言,要求接下来的字符都要与p匹配,但不包括匹配p的那些字符,即仅当子表达式p在此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 |
(?!p) |
零宽负向先行断言,要求接下来的字符都不与p匹配,即仅当子表达式p不在此位置的右侧匹配时才继续匹配。例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 |
(?<=p) |
零宽度正后发断言。仅当子表达式p在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟19后面的99的实例匹配。此构造不会回溯。 |
(?<!p) |
零宽度负后发断言。仅当子表达式p不在此位置的左侧匹配时才继续匹配。例如,(?<!19) 99 与不跟在 19 后面的 99 的实例匹配 |
$1、$2、...、$99 |
与 regexp 中的第1到第99个子表达式相匹配的文本 |
$& |
与 regexp 相匹配的子串 |
$` |
位于匹配子串左侧的文本 |
$’ |
位于匹配子串右侧的文本 |
$$ 直接量符号。
修饰符
字符 |
含义 |
i |
不区分大小写 |
g |
全局匹配,即找到所有的匹配 |
m |
多行匹配,^匹配一行和字符串的开头,$匹配一行和字符串的结尾 |
用于模式匹配的String方法
方法 |
示例 |
含义 |
search() |
'JavaScript'.search(/script/i) |
search的参数为一个正则表达式,若匹配成功则返回第一个与之匹配的子串的起始位置,若没有找到,则返回-1。该方法不支持全局搜索,即会忽略g标示。如果参数不为正则表达式,则会通过RegExp()构造函数转换。 |
replace() |
text.replace(/javascript/gi,'JavaScript') |
replace()方法用以执行检索和替换操作,第一个参数为正则表达式,第二个为用于替换的字符串。如果第一个参数是一个字符串而不是一个正则表达式,则replace()会搜索该字符串,只搜索不转换。这只是replace()的简单用法,举个例子来说它的另一个用法:var quote = /"([^"]*)"/g; text.replace(quote,'“$1”') 此例为用中文的双引号替换掉英文的双引号,但保持中间的内容不变,首先,看quote ,它匹配的是一串被”“包裹的字符串(字符串的中间不能含有”),再看$1 ,它的作用是存储前面quote中()里所匹配的字符串(这里的()即表示捕获型匹配),其他关于$的用法后面补充;另外,replace()的第二个参数可以是一个函数,该函数能够动态地计算替换的字符串 |
match() |
'1 plus 2 equals 3'.match(/d+/g) |
match()是最常用的String正则表达式方法,它的唯一参数就是一个正则表达式,返回由一个由匹配结果组成的数组(如果没有设置全局搜索g,它只检索第一个匹配,但依然返回一个数组) |
split() |
'12,34,56'.split(',') //返回[‘12’,‘34’,‘56’] |
该方法接受一个参数用作分隔符,然后将调用它的字符串拆分为以该分隔符作分割切点的子串,然后返回由这些子串组成的数组 |
RegExp对象
先啰嗦一下,以/…/创建的正则表达式对象的形式叫做正则表达式字面量,类似于var obj = {};这种理利用对象字面量创建对象的形式一样,而RegExp()则是创建正则表达式字面量的构造函数,类似通过构造函数创建对象一样。
正则表达式是通过RegExp对象表示的,除了RegExp()构造函数外,RegExp对象还支持三个方法和一些属性。
RegExp()接受两个参数,第一个必须,包含正则表达式的主体部分,也就是正则表达式直接量中两条斜线之间的部分;无论是字符串直接量还是正则表达式,都使用’’作为转义字符的前缀,即’’要变成’’。第二个参数可选,为i,g,m'
或者他们的组合。
RegExp的属性
属性 |
含义 |
source |
只读,包含正则表达式的文本 |
global |
只读的布尔值,用以说明是否有全局的g标示 |
ignoreCase |
只读的布尔值,用以说明是否有忽略大小写的i标示 |
multiline |
只读的布尔值,用以说明是否有多行匹配的m标示 |
lastIndex |
可读可写的整数,如果匹配模式带有全局g修饰符,这个属性存储在整个字符串下一次检索开始的位置,这个属性会被exec()和test()用到 |
RegExp的方法
方法 |
说明 |
exec() |
该方法对接受一个字符串作为参数,并对其执行匹配检索,如果找到匹配就返回一个数组,若没找到则返回null;属性index包含发生匹配的字符串的位置,属性input引用的是正在检索的字符串,lastindex为pattern的属性 |
test() |
该方法的参数为一个字符串,若有匹配,则返回true |
var pattern = /Java/g;
var text = "JavaScript is more fun than Java!";
var result;
result = pattern.exec(text);
console.log(result)
while((result = pattern.exec(text)) != null) {
console.log("Matched '" + result[0] + "' " + "at position:" + result.index + ";next search begins at:" + pattern.lastIndex);
console.log(pattern.lastIndex);
}
输出:
["Java",index: 0,input: "JavaScript is more fun than Java!"]
4
["Java",index: 28,input: "JavaScript is more fun than Java!"]
32
String的那几个方法并不会用到lastIndex属性,它们只是简单的将lastIndex重置为0;如果让一个带有g修饰的正则表达式对多个字符串执行exec()和test(),要么在每个字符串中找到所有匹配以便将lastIndex重置为0,要么显式的手动设置为0,否则,在下一次对新字符串进行检索时,开始检索的位置为上一次的lastIndex。如果不带g,则不用担心。另外,在ES5中,正则表达式直接量的每次计算都会创建一个新的RegExp对象,每个新的RegExp对象具有各自的lastIndex属性,这样大大减少残留lastIndex造成的意外影响。
注意事项
-正则表达式必须写在一行中