05正则表达式

Posted mingliangge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式:该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

正则表达式的文字模式:普通字符(如26个字母或者数字)、特殊字符(如./等)组成。

注:正则表达式里面不要添加无意义的空格符

 

正则匹配字符串

// i ignoreCase //忽略大小写
// m multiline //多行匹配
// g global //全局匹配

// 字面量方式

var str = “skfjsdlfkjsdfsSb”;
var pattern = /sb/i; //默认区分大小写,但是在/后面添加i就会忽略大小写
console.log(pattern.test(str));//test,匹配到就返回true,否则false
console.log(pattern.exec(str));//exec,匹配到就返回该字符串的数组,否则返回null

//构造函数方式

var strr = “skfjsdlfkjsdfsSb”;
var patterns = new RegExp(‘sb‘,‘i‘);//默认区分大小写,但是多加一个参数i后 就会忽略大小写
alert(patterns.test(strr));//test,匹配到就返回true,否则false
alert(patterns.exec(strr));//exec,匹配到就返回该字符串的数组,否则返回null

注:一般情况下使用字面量的方式,但是当匹配的内容是一个变量的时候  就用构造函数的方式

 

转义符()

在构造函数中的s、 等带有转义字符的,要多加一个转义字符 ,即\s、\n

表示换行:

表示制表键:

表示//://

表示\:\\

 

字符类([])

表示abc中的任意一个:[abc]

表示abc以外的所有字符:[^abc]

 

表示0-9:[0-9]  或者 d

除了0-9:[^0-9]  或者 D

 

表示a-z:[a-z]

表示A-Z:[A-Z]

表示中文汉字:[u4e00-u9fa5]

除了换行符以外:[^ ]  或者 .

 

表示字母数字下划线:[a-zA-Z0-9_]  或者 w

除了字母数字下划线:[^a-zA-Z0-9_]  或者 W

 

表示空格或制表符或Unicode的空白字符:s

除了空格或制表符或Unicode的空白字符:S

 

重复(量词{})

匹配 0 个数字:{0}  或者  .

匹配 >=0 个数字:{0,}  或者  *

匹配 0 <=  X  <=  1 个数字:{0,1}  或者  ?

匹配 >= 1 个数字:{1,}  或者  +

匹配3个数字:d{3}

匹配>=3个数字:d{3,}

匹配 3 <= X <= 5 个数字:d{3,5}

匹配a和b之间的字符(包括a、b): a.*b

 

非贪婪的重复

默认情况下都是贪婪匹配,在量词后面加上 ? 就会变成非贪婪匹配

var pattern = /a+/;      //默认情况有多少个a就匹配多少个a

var pattern = /a+?/;     //转为非贪婪匹配后,在条件允许情况下,尽可能匹配一个a

 

var str = ‘aaabbb‘;

var pp = /a.*b/;    //aaabbb

var bb = /a.*?b/;   //aaab

 

选择(|)

var str = ‘abc‘;

var pattern = /a|b|c/;      //从左到右,只匹配abc中的其中一个。

 

分组( () )

var str = ‘abcd‘;

var pattern = /(ab(c))d/;     //第一个值忽略分组abcd,第二个值最外层分组ab,第三个值为嵌套的分组c

var pattern = /(ab)cd1/;   //  1表示第一个分组的内容

var pattern = /(?:ab)/;      //?:表示非捕获,即在exec等里面不会展示出来

注:index为匹配到内容的起始位置,input为字符串的所有内容

 

首尾匹配(^ $)

var str = ‘ab cd‘;

var pattern = /^a/;    //匹配a开头的字符

var pattern = /cd$/;    //匹配cd结尾的字符

 

位置匹配之边界匹配()

就是w与W之间的位置,反过来理解就是,如果的前面和后面都是w,则不匹配

 

前瞻性与负前瞻性匹配

var str =javascript”;

var pattern = /java(?=script)/;     //前瞻性:如果java后面跟script,那么就匹配到。

var pattern1 = /java(?!script)/;    //负前瞻性:如果java后面不是script,那么就能匹配到。

 

RegExp对象的实例方法

var str =‘asdf‘;

var pa = /a/;

 

pa.exec(str):匹配到的话就返回匹配到的字符串数组,匹配不到的话就返回null

pa.test(str):匹配到的话就返回true,匹配不到的话就返回false

pa.toString():将pa里面的正则表达式,转换成字符串

pa.toLocaleString():将pa里面的正则表达式,转换为具有本地特色的字符串

pa.valueOf():为pa本身

 

注:

var a = ‘ab ab ab‘;

var pattern = /ab/;    // 循环输出exec时,默认情况下找到的ab的index为第一个,

var pattern = /ab/g;     //循环输出exec时,全局模式下找到的ab的index为0、3、6,若再循环多一次就为null,然后从头来。

 

 

RegExp对象的实例属性

var str = ‘ab‘;

var pa = /ab/ig;

pa.ignoreCase:判断pa是否写i,返回Boolean

pa.global:判断pa是否写g,返回Boolean

pa.multiline:判断pa是否写m,返回Boolean

pa.source:返回pa字面量形式的字符串

pa.lastIndex:一般在全局匹配下,第一次匹配到的值后,记录index;第二次在第一次值之后匹配,而不是从头匹配找到第二个匹配到的值的index;若匹配不到了lastIndex为0,然后继续…

 

构造函数属性

var str = ‘ab‘;

var pa = /ab/ig;

pa.test(str);   //必须要执行一次pa,后面的RegExp才能产生作用

 

console.log(RegExp.input);   //输出str的内容

console.log(RegExp.$_);   //输出str的内容

 

console.log(RegExp.lastMatch);   //最近一次匹配到的字符串

console.log(RegExp[‘$&‘]);   //最近一次匹配到的字符串

 

console.log(RegExp.leftContext);   //最近一次匹配到的字符串 ,左边的剩余字符

console.log(RegExp[‘$`‘]);   //最近一次匹配到的字符串 ,左边的剩余字符

console.log(RegExp.rightContext);   //最近一次匹配到的字符串 ,右边的剩余字符

console.log(RegExp[“$”]);   //最近一次匹配到的字符串 ,右边的剩余字符

 
console.log(RegExp.lastParen);   //上一次通过()分组里面捕获的内容
console.log(RegExp[“$+”]);   //上一次通过()分组里面捕获的内容


console.log(RegExp.$1);   //字面量中1表示第一个分组,构造函数中$1表示第一个分组,只支持$1-9

 

 

String对象方法

var str = ‘js jsjlsdkf‘;

var pattern = /js/;

//search

console.log(str.search(pattern)); //在str中查找与pattern匹配到的内容,找到返回index位置(无论在全局匹配还是一般匹配,只会返回第一个查到到的位置),找不到返回-1

 

//match

console.log(str.match(pattern));    //一般匹配下跟exec一样,匹配到的话就返回匹配到的字符串数组,匹配不到的话就返回null

var pattern = /(j)s/g;

console.log(str.match(pattern));  //全局匹配下,找到所有匹配到的内容返回(没有index或者input等属性),忽略所有分组

注:exec与match的区别:exec是RegExp对象属性方法,match是String属性方法。

exec无论是否全局匹配都会返回分组中匹配到的内容,都只会返回当前匹配到的一个内容,而不是全部返回。

match非全局的情况下才返回分组中匹配到的内容,全局匹配只能匹配到所有匹配到的字符。

 

m multiline //多行匹配,要在全局匹配g下 和 首匹配/尾匹配 才能展现出效果

var str = ‘1.js
2.js
3.js‘;

var pattern =  /js$/mg;   //不加m表示只有一行,只会匹配到最后一个js;加了m之后表示3行,所以匹配3个js

console.log(str.match(pattern));

 

//split

var str = ‘sd,wer,er,wer,dfg‘;

var pattern =  /,/;    //左右两边  没有空格的情况下

var pattern =  /s*,s*/;    //左右两边  有多个空格的情况下

console.log(str.split(pattern));   //将字符串用逗号隔开,转变为数组

 

//replace

var str = ‘js you js abc dd‘;

var pattern =  /js/g;    //要在全局模式下,不然只会替换一个js

console.log(str.replace(pattern,html‘));  //将js替换成html

 

var pattern =  /(j)s/g;

document.write(str.replace(pattern,function($al,$1){

return $al;  //这时$al表示匹配到的所有内容

//$1表示第一个分组的内容

})); //将js替换成html

 

以上是关于05正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

python:如何使用正则表达式创建此代码?

攻破难啃的骨头-正则表达式(转)