初学正则

s.png

正则表达式

正则表达式主要用来验证客户端输入的数据
经典面试题(筛选字符)

定义方式

--使用//来定义(字面量形式) 一般情况下使用字面量的形式来定义

eg:
var reg = /\a+/g;   (English为模式字符串,g为模式修饰符)
var str = "dhenfaaaajfeia";
console.log(reg.test(str ));         //返回值true

--使用newRegExp()来定义 当模式字符串需要动态改变时,使用此方法定义。

/*对RegExp()函数进行构造调用
    var a = /pig/g;
    var reg = new RegExp(a,"ig");  
    (用RegExp的方式来创建正则表达式,第一个参数可以是字面量也可以是变量(a),第二个参数是模式修饰符(ig))
    console.log(reg.exec("this is a pig"));   
    //返回值是数组---> ["pig", index: 10, input: "this is a pig", groups: undefined]

元字符

元字符:修饰字符的字符
--或(|)

匹配模式字符串中任意一组字符
eg:
this|where|go
匹配this,where,go中的任意一个

--单个字符( . \d \D \w \W [] [^])

.      匹配除换行符以外的任意字符
\d     匹配单个数字
\D     匹配单个非数字
\w     匹配字母,数字,_
\W     匹配非字母,非数字,非_
[]     匹配括号[]中字符集的任意字符
[^]    匹配不在括号[]中字符集的任意字符

--量词字符(* ?+ {m,n})

x*        匹配0个x或多个x
x?       匹配0个x或1个x
x+        匹配1个x或多个x
x{m,n}    至少m个x,至多n个x

--锚点字符( ^ $)

匹配行首^        匹配行尾$
eg:
^mn$
以m开头,以n结束
^ 在[]内表示非,在[]外表示行首

--空格(\s)

\s匹配空格字符,空格,换行符,制表符

--单词边界(\b)

\b匹配单词边界。此元字符有天坑--->\b匹配字符时,将满足\w(字母,数字,_)的也作为单词的边界
eg:
item-1 item-2 item-3
当使用\b去匹配item-1时,会将item-1拆分为两个独立的单词(item,-1)

--可重复的子项

\1($1)       匹配第一个分组的内容
\2($2)       匹配第二个分组的内容
\3($3)       匹配第三个分组的内容

-- 分组(())

强调括号内的字符是一个整体
eg:
var reg = /(ab)+/g;
var str = "ab ababcc chsbaab"
console.log(str.match(reg));        //返回值 ["ab", "abab", "ab"]

与正则相关的API

--与RegExp相关的API

RegExp_prototype_test()
返回值为布尔值
--RegExp_prototype_exec()
返回值是数组:
[匹配成功的子字符串,1号分组子字符串,2号分组...,匹配成功的子字符串第一次出现的索引,源字符串]
eg:
["pig", index: 10, input: "this is a pig"]

--与String相关的API

String_prototype_match()
   String_prototype_match(正则表达式 模式修饰符)   
    匹配源字符串出现的模式字符串b(b也可以是变量)   此API使用正则时需要    开启全局g   返回值是数组
    var str = "sbfjabccehdgabc";
    console.log(str.match(/b/g));   //返回值["b","b","b"]

String_prototype_splite()
String_prototype_splite(模式字符串)
 利用此API的第一个参数模式字符串将源字符串分割  返回值是分割后的数组
eg:面试题 
(筛选出出现次数最多的字符)  代码见webstorm

String_prototype_replace()
String_prototype_replace(字符串/正则表达式,函数/字符串)
此API需要开启全局匹配g
                                   函数   参数
                                              第一个参数    匹配成功的子串
                                              第二个参数    第一个分组的内容
                                              第三个参数    第二个分组的内容
eg:面试题
webstorm中(过滤敏感词)

模式修饰符

i         忽略大小写
g         全局匹配(没有开启全局匹配,每次用整个源字符串去匹配正则;开启全局匹配,每次将匹配成功后剩下的源字符串去匹配正则)
m         多行匹配,只影响^与$
eg:
 var reg = /^xxx/mg;
    开启m:认为每一行从^开始
    不开启m:认为只有第一行从^开始

正则的静态属性 (正则方法被调用时才有用)

$分别是它们的简写形式
input($_)                        匹配源字符串        
lastMacth($&)                    最后一次匹配的子字符串
lastParen($+)                    最后一次分组括号内匹配的子字符串
leftContext($`)                  最后一次匹配的子字符串前面的子字符串
rightContext($')                 最后一次匹配的子字符串后面的子字符串
$1                               第一个分组的内容
$2                               第二个分组的内容
eg:webstrom中正则的静态属性

正则的实例属性

global               是否开启全局
multiline            是否开启多行匹配
ignoreCase           是否忽略大小写
source               (正则表达式的源字符串形式)==模式字符串  
 
lastIndex
代表下次匹配的起始位置(索引位置)
(只有正则表达式开启了全局g,lastIndex的索引位置才会随着匹配的子字符串进行改变,否则lastIndex的索引位置永远从0开始)
规则:
1)如果lastIndex的索引位置大于或的等于源字符串的长度
reg.test()             //返回值false
reg.exec()            //返回值null
reg.laseIndex      //索引位置置为0
2)如果lastIndex小于源字符串的长度,就进行lastIndex的正常语法进行匹配
reg.test()             //返回值true
reg.exec()            //返回值:匹配成功子字符串的数组
reg.lastInndex     //紧接着匹配成功的子字符串的下一个位置
3)当匹配空白字符串{\s{0}}时(坑)
当lastIndex小于源字符串长度时
reg.test()             //永远为true
reg.exec()            //永远为""
reg.lastIndex      //永远为0
最佳实践:
不要让模式字符串 匹配空白字符的正则
\s{0}    \s*    a*    b*    a{0}

贪婪,惰性

--贪婪:
先看看整个字符串是否存在匹配,如果未发现匹配,则去掉字符串中的最后一个字符,再次尝试匹配,如果还是未发现匹配再去掉最后一个字符,循环往复直到发现一个匹配或者字符串不剩任何字符串。
--惰性:
先看看字符串的第一个字母是否存在匹配,如果未发现匹配,则读入下一个字符,再次尝试匹配,如果还是未发现匹配则再读取下一个字符,循环往复直到发现一个匹配或者整个字符串都检查过也没有发现匹配。(第一次匹配成功就不会再向下匹配)


可重复的子项

\1      第一个分组的内容
eg:
var reg = /(\d)\1/
var str = "22";    
var str2 ="23";       
console.log(reg.test(str))           //返回值为true
console.log(reg.test(str2));        //返回值为false
注意点:\1的内容必须与第一个分组的内容一致(一模一样)

\2      第二个分组的内容
var reg = /(\d)\1(\w)\2/
var str = "22xx";    
var str2 ="23xy";       
console.log(reg.test(str))           //返回值为true
console.log(reg.test(str2));        //返回值为false
注意点:\2的内容必须与第二个分组的内容一致(一模一样)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容