JavaScript正则表达

为什么要用正则

正则表达式是为了特地处理文本的两个题目而发作的:

  1. 查找特定的文本(搜刮)

  2. 查找并编辑特定的文本(替代)

JavaScript中的正则

JavaScript中的正则表达式用RegExp对象来示意。

建立体式格局:

 1. var pattern = new RegExp("s$");  //用RegExp()组织函数来建立
 2. var pattern = /s$/;  //直接量语法来建立

正则的语法

直接量字符

平常来说,正则表达式中的一切字母和数字都是根据字面寄义举行婚配的。eg:/s/就是婚配字母s。
非平常的话,就是那些转义字符和正则中自带的一些特别寄义的标记。假如想在正则表达式中运用这些字符的直接量举行婚配,则必需运用前缀.

转义字符:\n \r \t \o \v \f \xnn \uxxxx \cX
殊寄义的标记: ^ $ . * +  ? = ! : | \ / () [ ] { }  

字符类

用方括号包裹直接量字符就构成了字符类。

/[abc]/  //婚配字母"a","b","c"中的恣意一个

注重:字符类能够婚配包含在中括号中的一系列字符中的恣意一个,然则婚配的效果只能够是个中的一个而不是多个。

var str="abcd";
var reg=/[abcd]/;
console.log(str.match(reg));
//效果是 ["a", index: 0, input: "abcd"]

运用连字符”-“

字符类运用连字符目标是用来示意字符局限。

    /[a-z]/        //婚配小写字母
    /[a-zA-Z0-9]/  //婚配任何字母和数字

注重:字符类能够运用连字符”-“来肯定一个婚配的局限,固然运用连字符也是有准绳的,前后两个字符是有递次的,假如运用雷同的编码,背面的字符码位应大于或即是前面字符的码位,比方:
[0-9]//准确的
[9-0]//毛病的

消除型字符类”^”

[^]是一个消除型字符类,用以婚配不在中括号中的任一字符,固然婚配效果也只能够是一个字符.

/[^abc]/   //婚配除了字符"a"、"b"、"c"以外的恣意字符

反复

处理正则表达式中某元素的“反复涌现次数”。

反复字符语法:

{n,m}  婚配前一项最少n次,但不能超过m次
{n,}   婚配前一项n次或许更屡次
{n}    婚配前一项n次
?      婚配前一项0次或许1次,也就是说前一项是可选的,等价于{0,1}
+      婚配前一项1次或许屡次,等价于{1,}
*     婚配前一项0次或许屡次,等价于{0,}

贪欲反复 vs 非贪欲反复

贪欲反复: 尽量多的婚配

非贪欲反复: 尽量少的婚配

    ?       ??
    +       +?
    *       +?

注重:运用非贪欲的婚配形式所得的效果能够和希冀并不一致。试一试下面例子想一想为什么:

    var str = 'aaab';
    var reg =  /a+?b/;
    console.log(str.match(reg));

挑选、分组和援用

字符”|”

字符”|”用于分开供挑选的字符 ,实在就是或的意义。比方/ab|cd|ef/ 婚配的是“ab”或“cd”或“ef”。

注重:挑选项的尝试婚配递次是从左到右斟酌,直到发现了婚配项。假如左侧的挑选项婚配,则疏忽右侧的婚配项,纵然它发作更好的婚配。

分组

我们能够经由过程运用圆括号”()”来对正则表达式举行分组 。也就是说把括号内的当做一个自力的单位。构成正则表达式中的子表达式。

援用

援用:我们用援用的对象是谁?

这里就要说下,圆括号”()”在正则表达式中另一个作用是在完全的形式中定义子形式 。

比方:我想要检索的前提是3个字母加上4个数字

    var pattern = /[a-z]{3}\d{4}/ ;  //3个字母加4个数字的婚配形式

但假定我们真正体贴的是每一个婚配尾部的数字?要怎样援用数字?so,圆括号”()”派上用场了。

    var pattern = /[a-z]{3}(\d{4})/ ;  //3个字母加4个数字的婚配形式 

带圆括号的表达式的另一个用处是许可我们在统一正则表达式的后部援用前面的子表达式。这是经由过程在字符””后加一名或多位数字完成的。比方,1援用的是第一个带括号的子表达式,3则示意援用的是第三个带括号的子表达式。

问:假如圆括号”()”中嵌套圆括号”()”,那末圆括号”()”的位置怎样盘算?

答:以圆括号”()”的左括号位置来算。

var pattern = /([Jj]ava([Sscript)?)\sis\s(fun\w*)/ ;  //([Ss]cript)就被指定为/2 

接下来再来看看一个例子:

var pattern = /["'][^"']*["']/ ;   //婚配的是单引号或双引号以内的0个或多个字符

假如我想要前后引号是婚配的(都是单引号或都是双引号)呢?(这时候就要想起援用了)

var pattern = /(["'])[^"']*\1/ ; 

正则表达式的挑选、分组和援用字符

    |         挑选。婚配的是该标记左侧的子表达式或右侧的子表达式,实在就是布尔“或”
    (…)         组合。将几个项目组合为一个单位,这个单位可由*、+、?和|等标记运用,而且 还能够记着和这个组合婚配的字符以供今后的援用运用
    (?:…)    只是分组。把项目组合到一个单位,然则不影象与该组婚配的字符
    \n        和第n个分组第一次婚配的字符相婚配。组是括号 中的子表达式(可嵌套,以左半括号最先数,从1最先数,一到数下去 ),以(?:…)分组的组不举行编码

指定婚配位置

正则表达式中的有些元素不婚配某个可见的字符,它们指定婚配发作的正当位置,我们称这些元素为正则表达式的锚,它们将形式定位在搜刮字符串的特定位置上。

^    婚配字符串的开首,在多行检索中,婚配一行的开首
$    婚配字符串的末端,在多行检索中,婚配一行的末端
\b   婚配一个单词的边境,简言之,就是位于字符\w和\W之间的位置,或位于字符\W和字符串开首或末端之间的位置(但须要注重,[\b]婚配的是退格符)
\B   婚配非单词边境的位置
(?=p) 零宽正向先行断言,请求接下来的字符都与p婚配,但不能包含婚配p的那些字符
(?!p) 零宽负向先行断言,请求接下来的字符不与p婚配

修饰符

修饰符用以申明高等婚配形式的划定规矩,放在”/”标记以外。

i   实行不辨别大小写的婚配
g   实行一个全局婚配,简言之,即找到一切的婚配,而不是在找到第一个以后就住手
m   多行婚配形式,^婚配一行的开首和字符串的开首,$婚配行的完毕和字符串的完毕

例子:

var str="This is an\n antzone good"; 
var reg=/an$/;
console.log(str.match(reg));
//以上代码不能够婚配字符串"an",只管"an"背面已换行了,然则并没有采纳多行婚配,所以不是字符串行的末端。
var str="This is an\n antzone good"; 
var reg=/an$/m;
console.log(str.match(reg));
//以上代码能够婚配字符串"an",由于采纳了多行婚配。

总结:
本文简朴的引见了javascript正则表达式的一些基础知识,总结知识点就是用[],{},(),正则的特别字符,锚,另有修饰符等等,来构成一个一个庞杂的正则表达式。

    原文作者:络克少年
    原文地址: https://segmentfault.com/a/1190000009645098
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞