正则表达式

特殊的标点

^ $ . * + = ! : | \ / ( ) [ ] { }
此处列有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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值