todaylg

正则表达式基础

2017-07-11 todaylg基础备忘

正则表达式基础

正则表达式是用于匹配字符串中字符组合的模式。嗷嗷有用。在 JavaScript中,正则表达式也是对象。

这些模式被用于 RegExp的

  • exec()(一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)。)

  • test() (一个在字符串中测试是否匹配的RegExp方法,它返回true或false。)。

以及 String 的

  • match()(一个在字符串中执行查找匹配的String方法,它返回一个数组或者在未匹配到时返回null。)

  • replace()(一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。)

  • search()(一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。)

  • split() (一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的String方法。)

创建正则表达式

在JavaScript中可以通过两种方法来创建一个正则表达式:

1.使用一个正则表达式字面量

var re = /pattern/flags;
const regex = /ab+c/;
const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;

2.调用RegExp对象的构造函数

var re = new RegExp("pattern", "flags");
let regex = new RegExp("ab+c");
let regex = new RegExp(/^[a-zA-Z]+[0-9]*\W?_$, "gi");
let regex = new RegExp("^[a-zA-Z]+[0-9]*\W?_$", "gi");

其中的flags代表正则表达式标志,正则表达式有四个可选参数进行全局和不分大小写搜索。这些参数既可以单独使用也可以一起使用在任何顺序和包含正则表达式的部分中。

  • g:全局搜索

  • i:不区分大小写搜索

  • m:多行搜索

  • y:/y标识让一个未锚定的正则只在目标字符串的当前位置匹配成功或匹配失败./g或其他东西也会影响当前位置具体在哪里.但比起其他因素,/y是完全独立的(更底层)…(粘滞的意思就是”使用隐式的^锚点把正则锚定在了lastIndex所指定的偏移位置处”)

简单的模式匹配

1.匹配字符串字面值

var val = "LG";
var reg = /LG/;    //就是简单的用字符串字面量查找
if(reg.test(val)){
    alert('验证通过');
}else{
    alert('验证未通过');
}

2.匹配数字

\d
[0-9]  
[0123456789]    //虽然语法不一样,但是效果是一样的

3.匹配非数字

\D
[^0-9] 
[^\d]

4.匹配单词和非单词

\w    // \w只匹配字母数字和下划线  \D还会匹配空格、标点符号等字符  \w在英语环境下相当于 [_a-zA-Z0-9]
\W    // \W匹配非单词字符 相当于[^_a-zA-Z0-9]

5.匹配空白符

\s    // \s相当于 [ \t\n\r] 也就是说\s会匹配空格、制表符、换行符、回车符 (不匹配换页符(\f)、水平空白符(\h)等特殊的空白字符)
\S

6.匹配任意字符

.    //单个点号匹配任意字符
.*    //匹配零个或者多个字符

边界

1.行的起始和结束

^    //^会匹配行或者字符串的起始位置
$    //$会匹配行或者字符串的结束位置
举个例子:
var val = "LGdsadsadEnd.end";
var reg = /^LG.*End\.end$/;
if(reg.test(val)){
    alert('验证通过');
}else{
    alert('验证未通过');
}

2.单词边界与非单词边界

\b    //\b匹配单词边界  比如\bLG\b \b和^与$一样是个零宽度断言
\B    //匹配非单词边界

3.\A和\Z匹配主题词的起始和结束(???)

4.使用元字符的字面值

Q和\E之间的任意字符都会被解释为普通字符
\Q$\E    //会匹配$  (其实也可以在$前加\进行转义也是可以的)  //测试这个\Q和\E在JavaScript正则并不好使,还是用\进行转义吧

选择、分组和后向引用

1.选择操作

(the|The|THE)  //其实直接设置flag为i,即可忽略大小写的区别了j

2.子模式

//其实(the|The|THE)也算是三个模式,但是这种情况下匹配第二个子模式不依赖于是否匹配第一个
(t|T)h(e|eir)    //这个情况第二个子模式(e|eir)就依赖于第一个子模式(tT),它会匹配the The their Their
\b[tT]h[ceintry]*\b    //则匹配the thee thy等单词

3.捕获分组和后向引用

一个正则表达式模式使用括号,将导致相应的子匹配被记住。例如,/a(b)c /可以匹配字符串“abc”,并且记得“b”。回调这些括号中匹配的子串使用数组元素[1],……[n]
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");    //[1]、\1都不好使
console.log(newstr);//这个表达式输出 "Smith, John"。

4.非捕获分组

//不需要任何后向引用时
(?: x)    //匹配x但是不记住匹配项

字符组

字符组就是[],也叫方括号表达式。使用字符组可以匹配某个范围的字符:

[a-z][0-9]
[\w\s]    //匹配空格和单词字符  等同于[_a-zAA-Z \t\n\r]

1.字符组取反

[^a-z]    //^在字符组里的意义为取反

2.并集与差集

[0-3[6-9]]    //匹配0到3之间的数字或者6到9之间的数字     //测试JavaScript不支持
[a-z&&[^m-r]]    //匹配a到z之间的字符,但是其中m到r之间的字符除外    //测试JavaScript不支持

量词

1.贪心、懒惰和占用

量词自身是贪心的。贪心的量词会首先匹配整个字符串。尝试匹配时,它会选定尽可能多的内容,也就是整个输入量词首次尝试匹配整个字符串,如果失败则回退一个字符后再尝试。这个过程叫做回溯。它会每次回退一个字符,直到找到匹配的内容或者没有字符可尝试了为止。懒惰的量词则使用另一种策略,它从目标的起始位置开始尝试寻找匹配,每次检查字符串的一个字符,寻找它要匹配的内容。最后它会尝试匹配整个字符串。占有量词会覆盖整个目标然后尝试寻找匹配内容,但是它只尝试一次,不会回溯。

2.用*、+、?进行匹配(基本量词)

.*    //它会以贪心的方式匹配主文本中的所有字符 正则表达式之后加*表示该正则表达式所匹配的文本接连出现任意次(包括零次)
9+    //+和*的区别在于+会寻找至少一个9,而*会寻找零个或者多个9
9//匹配零次或一次

3.匹配特定次数

7{1}    //使用花括号可以限制某个模式在某个范围内匹配的次数,未经修饰的量词就是贪心量词。 会匹配第一次出现的7
7{1,}    //匹配一个或者多个7    相当于7+    同理7{0,}和7*也是相同的、7{0,1}和7?是相同的  还可以m到n次:7{3,5}匹配3到5个7

4.懒惰量词

如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。

9+    //匹配一个或者多个9
9+?    //变懒了,只匹配一个    //加了黑人问号(?)都变懒了,能不干就不干(匹配最少)

9//匹配零次或一次
9??    //变懒了,一个都不匹配了

5.占用量词

0.*+    //000xxx  可以匹配到,和贪婪好像一样
.*+0    //000xxx  不可以匹配到,因为不会回溯,一下就选定了所有输入,第一下没找到就不找了。

JavaScript正则表达式没有占有模式,只有贪婪和非贪婪(懒惰)模式,占有模式反而会报错。 很多其他语言支持的正则表达式功能在JavaScript中不支持。 ​