正则表达式

来源:互联网 发布:淘宝大学江西商学院 编辑:程序博客网 时间:2024/06/08 02:56

特殊的标点

^ $ . * + = ! : | \ / ( ) [ ] { }
此处列有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造成的意外影响。

注意事项

-正则表达式必须写在一行中

0 0