加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:24:14 所属栏目:百科 来源:网络整理
导读:特殊的标点 ^ $ . * + = ! : | / ( ) [ ] { } 此处列有14个;若想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀’’,这是一条通行规则。ps:如果不记得哪些标点符号需要进行转义,可以在每个标点前都加上反斜线。 字符串类 字符 含义 []

特殊的标点

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

注意事项

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读