知识点总结-正则表达式

1.声明方法

  • new RegExp()
var a= new RegExp('xyz');   //等同于/xyz/
var b= new RegExp("\\s");   //等同于/\s/
var c =new RegExp("\s");     //等同于/s/  这里注意 使用new声明正则的时候如果存在转译就会消耗一个"\"符号
  • 直接书写
var a=/xyz/;
var b=/\s/;

2.正则对象的属性和方法

  • 修饰符属性
    与修饰符有关的属性,返回一个布尔值
    >ignoreCase :表示不区分大小写
    >global :表示是否全局匹配
    >multiline :表示是否多行匹配
var a=/xyz/igm;
a.ignoreCase // true;
a.global         //true;
a.mulitline      //true;
  • 另外有一些与修饰符无关的属性,主要有两个
    >lastindex 下一次匹配的位置,要跟修饰符g一起用
    >source 正则的字符串形式
var a= /xyz/igm;
var b=/\s/igm;
a.lastindex;        //0 从头开始
b.source  ;       //"\s"
  • 方法
    • test() 返回Boolean值 表示当前正则是否能够匹配字符串
      >正则中没有修饰符g,则只匹配一次
/x/.test("_x_x");
/y/.test("_x_x");

>正则中有修饰符g ,则多次匹配

var a=/x/g;
var s="_x_x";
a.test(s);       //true;
a.lastIndex;  //2;
a.test(s);      //true;
a.lastIndex   //4;
  • exec(): 如果发现匹配,则返回一个数组,如果没有匹配 则返回null;
var s="_x_x";
/x/.exec(s);     //["x"]
/y/.exec(s)       //null

>使用exec()如果正则中有() 则含有组匹配 如果成功匹配 则返回的数组中第一个值是匹配成功的值,第二个值组内匹配的值 ,如果存在多个组匹配则数组长度+1,位置依次类推。

var a = /_(x)/;
a.exec("_x_x")  //["_x","x"]
var b=/a(b)(c)/;
b.exec("abc")   //  ["abc",b,c]

> 使用exec()返回的数组中有两个属性 一个是input 另一个是index

var a=/a(b+)a/g;
var s="_abbba_aba"
var a1=a.exec(s);
a1.index   //1 从字符串第二位成功匹配
a1.input   //"_abbba_aba" 匹配的原字符串

> 如果正则中含有修饰符g则可以多次使用exec()进行匹配

var a=/a(b+)a/g;
var s="_abbba_aba"
var a1=a.exec(s);
console.log(a1);            //["abbba","bbb"]
console.log(a.lastIndex);   //    6
var a2=a.exec(s);
console.log(a2);            //["aba","b"]
console.log(a.lastIndex);   //  10
var a3=a.exec(s);
console.log(a3);           // null             本次的匹配位置是10 字符串最大索引是9 所以null
console.log(a.lastIndex); //undefined
var a4=a.exec(s);
console.log(a4.index);                        //index=1 重新开始匹配
console.log(a3);           //["abbba","bbb"]       
console.log(a.lastIndex); //   6

3.字符串的属性和方法

  • search
    >如果匹配成功则返回第一个满足匹配字符串的位置,如果没有匹配成功则返回-1
var s="_x_x";
s.match(/x/);       //1
s.match(/y/);       //-1
  • match
    >如果不带修饰符g 则返回第一次匹配值组成的数组 如果没有成功则返回null
var s="_x_x";
s.match(/x/);     //["x"]
s.match(/y/);      //null

>如果带修饰符g 则返回所有匹配组成的数组

var s="_x_x";
s.match(/x/g);   //["x","x"]

>如果存在组匹配,如果成功匹配,数组的第一个值是匹配结果,第二个值是组内匹配结果,依次类推。

var s="_abba_aba";
s.match(/a(b+)a/);  ["abba","bb"]
  • split
    >函数调用:str.split(separator, [limit])
    返回值是一个数组。参数第一个参数可以是正则,第二个参数可以限定返回数组的长度,
var s="a, b,  c,d"
var arr=s.split(/,\s*/);           //其中\s* 代表匹配0到多个空格
console.log(arr)                     //["a", "b", "c", "d"]
var arr2=s.split(/,\s*/,2)      
console.log(arr2)                  //["a", "b"]
  • replace
    >函数调用:str.replace(search, replacement)replace()返回值是一个新的字符串。
    >>参数第一个值可以是正则 正则可以带修饰符g,带g的情况下会做全局匹配替换
var s="aaa"
var s1=s.replace(/a/,"b")         //s1="baa"
var s2=s.replace(/a/g,"b")       //s2="bbb"

>>参数第二个值可以是替换的字符串,也可以是$符号组成的参数,也可以是函数
$符号
$& 指代匹配的子字符串。
$` 指代匹配结果前面的文本。
$' 指代匹配结果后面的文本。 //其中'符号需要转译 $'
$n 指代匹配成功的第n组内容,n是从1开始的自然数。
$$ 指代美元符号$

var s1="hello world".replace(/(\w+) (\w+)/,"$2 $1");   //"world hello"
var s2=('abc').replace(/b/,"[$`-$&-$\']")                 //"a[a-b-c]c"      

function

var s='123';
var s2=s.replace(/\d/g,function(match){
  return match*2;
});                                                          //s2="246";

4.常用的一些写法

<pre>
\d :匹配数字 相当于[0-9]
\w:匹配字母数字下划线相当于[A-Za-z0-9_]
\s :匹配空格(包括制表符、空格符、断行符等) 相当于[\t\n\r\v\f]
[a-zA-Z0-9]: 匹配所有字母和数字

5.特殊字符

\cX 表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符。
[\b] 匹配退格键(U+0008),不要与\b混淆。
\n 匹配换行键。
\r 匹配回车键。
\t 匹配制表符tab(U+0009)。
\v 匹配垂直制表符(U+000B)。
\f 匹配换页符(U+000C)。
\0 匹配null字符(U+0000)。
\xhh 匹配一个以两位十六进制数表示的字符。
\uhhhh 匹配一个以四位十六进制数表示的unicode字符。

6.贪婪模式与非贪婪模式(+、*、?)

+符号和*符号默认是尽可能的匹配更多的字符,这就是贪婪模式。
如果在后面加上问号,就会变成一旦满足条件后就不再匹配 这就是非贪婪模式。
*?:表示某个模式出现0次或多次,匹配时采用非贪婪模式
+?:表示某个模式出现1次或多次,匹配时采用非贪婪模式。

/a+/.exec("aaa");           //["aaa"]
/a+?/.exec("aaa);          //["a"]       //满足有一个a即可
/a+?b/.exec("aab")         //["aab"]    //满足一个或者多个a后面有一个b
/a*?b/.exec("aab");           //["aab"]   //满足0个或者多个a后面有一个b
/a*?b/.exec("b")                 //["b"]     //没有a直接返回b

6.组匹配

  • 定义:就匹配就是用括号包裹起来形成一个整体
var s="abcabc"
s.match(/abc+/);              //["abc"]      没有括号 只有c受到了加号的影响
s.match(/(abc)+/);            //["abcabc", "abc"]    
  • 组匹配可以使用\n来替代组中的内容,还可以嵌套使用
var s="abc_cab";
/(..)(.)_\2\1/.test(s);      //其中\2代表的是ab\1代表的是c
var s="abc_ab_abc";
/((..).)_\2_\1/.test(s);     //其中\2代表的是ab \1代表的是abc
  • 组匹配最大的应用就是用来匹配web标签
var tag=/^<(\w+)>([^<]*)<\/\1>$/;
var match=tag.exec("<h1>我是头标题</h1>")   //["<h1>我是头标题</h1>", "h1", "我是头标题"]
var html = '<b class="hello">Hello</b><i>world</i>';
var tag = /<(\w+)([^>]*)>(.*)<\/\1>/g;
var match1=tag.exec(html);            //["<b class="hello">Hello</b>", "b", " class="hello"", "Hello"]
var match2=tag.exec(html);            //["<i>world</i>", "i", "", "world"]

7.组匹配的其他用法

  • 非捕获组 (?:x) 功能与普通的组匹配一样,但是使用exec和字符串的match的时候不会返回组中的内容
var match1=/(?:.)b(.)/.exec("abc");    //["abc", "c"]
var match2="foolfool".match(/(?:foo)+(.)/);    //["fool", "l"]
  • 先行断言x(?=y ) 就是x必须是在y的前面 y不会返回
/\d+(?=%)/.exec("99%");   //["99"]
  • 先行否定断言x(?!y) 就是x不能在y的前面 也不会返回
/\d+(?![.])/.exec(3.14);   //[14]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • RegExp 三大方法本文的RegExp采用直接量语法表示:/pattern/attributes。attribu...
    恩德_b0c2阅读 451评论 0 0
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 3,981评论 0 20
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 3,975评论 0 13
  • 第一章 亲密育儿法的由来 1、宝宝的挑剔、难以满足是宝宝的性格,不是养育者的养育能力有问题; 2、宝宝的哭声是一种...
    二喜小仙女阅读 563评论 0 2
  • 前段时间看了小喜小婵的一篇文章。什么才是真正的朋友?看完之后自己想了很多,我把小喜当朋友,但是我这个朋友做的真...
    如影随行_形影相随阅读 216评论 2 2