JavaScript正则,你要的姿势我都有

js中正则表达式的功能非常强大,匹配、替换、查找无所不能。利用好正则可以达到事半功倍的效果。
基础内容不再赘述,这里只聊一些比较容易被忽略的技巧。

匹配数量
{n}匹配n次
{n,}匹配大于等于n次
{n,m}匹配大于等于n次,小于等于m次
*匹配前一个表达式0次或多次,相当于{0,}
+匹配前面一个表达式1次或者多次,相当于{1,}
?匹配前面一个表达式0次或者1次。相当于 {0,1}。跟在* + ? {} 后,将会使量词变为非贪婪的。

字符集
[abc]就是一个字符集,表示匹配方括号中的任意字符。
也可以使用"-"指定一个范围如:[a-c]等同于[abc]
对于(.)(*)等特殊符号,在字符集中不再具有特殊含义,只代表本身字符。(可以不进行转义)
注意:字符集中没有顺序限制,如下示例

/[.a-z]+/.test('abc.d.ef')

为true

反向字符集
[^abc]反向字符集,匹配没有包含方括号中的字符。

模式匹配

1、==(x)==
(x),匹配x并且记住匹配项。使用如下:
/(abc) (def) \1 \2/
上面的正则中(foo) (bar)匹配并记住字符串“abc def abc def”中前两个单词,模式中的\1 \2 是匹配字符串中的后两个单词。
\1 \2 \n 这种方式用在正在表达式的匹配环节。
1、2、$n 用在正则表达式替换环节。例如:

'abc def'.replace( /(...) (...)/, '$2 $1' )

2、==(?:x)==
(?:x),匹配x但是不记住匹配项,也可以叫做非捕获括号。
/abc{1,2}/,匹配数量只会针对于最后一个字母"c"生效。在使用了非捕获括号后
/(?:abc){1,2}/,这时匹配数量会针对"abc"生效。

3、==x(?=y)==
x(?=y),匹配'x',并且只有在'x'后面跟着'y'时匹配。也叫做先行断言。
/Java(?=Script)/,可能会匹配到'Java',条件是当它后面跟着'Script'时。
需要注意的是,‘Script’不是匹配结果的一部分。
例如:

/Java(?=Script)/.test('JavaScript') // true
/Java(?=Script)/.test('JavaEE') // false

4、==(?<=y)x==
(?<=y)x,匹配'x',并且只有在'x'前面是'y'时匹配。也叫做后行断言。
/(?<=Java)Script/,会匹配到' Script ',只有在它前面是' Java '时。
同上‘Java’也不是匹配结果的一部分。
例如:

/(?<=Java)Script/.test('JavaScript') // true
/(?<=Java)Script/.test('TypeScript') // false

5、==x(?!y)==
x(?!y),仅仅当'x'后面不跟着'y'时匹配'x'。也叫做正向否定查找。
例如:

/Java(?!Script)/.test('JavaScript') //false
/Java(?!Script)/.test('JavaEE') //true

6、==(?<!y)x==
(?<!y)x,仅仅当x前面不跟着y时匹配x。也叫做反向否定查找。
例如:

/(?<!Java)Script/.test('JavaScript') //false
/(?<!Java)Script/.test('TypeScript') //true

边界匹配

==\b==
\b 匹配一个词的边界。一个词的边界就是一个词不被另外一个字符跟随的位置或者没有其他字符在其前面的位置。一个匹配的词的边界的内容的长度是0。
如字符串"script"
/\bs/,匹配“script”中的‘s’;
/cr\b/,并不匹配"script"中的'cr',因为'cr'被一个字符'i'紧跟着。
/pt\b/,匹配"script"中的'pt',因为'pt'是这个字符串的结束部分。这样他没有被一个字符紧跟着。
/\w\b\w/,将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有字符跟随和有字符跟随两种情况。
==\B==
与之用法对应的是\B,匹配非单词边界。
如字符串"pest text"
/t\B../,匹配到的是'tex'。

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

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,077评论 0 3
  • 1.12个常用的js正则表达式 (1)在input框中只能输入金额,其实就是只能输入最多有两位小数的数字** (2...
    Bai1997_阅读 552评论 0 0
  • 忘了从哪收集的资料了,放这儿,以备不时之需。 只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{...
    study_monkey阅读 1,389评论 0 7
  • 1、正则表达式 在开发中,通常很多数据都会使用String类存储。原因:操作字符串的功能比较多,比较方便。在操作S...
    Villain丶Cc阅读 1,716评论 0 5
  • 我们都知道,孙悟空这只妖猴一直在不断的更换明号。石猴、美猴王……等等,不过,在中间孙悟空大闹天宫后竟然不自量力...
    常曜倬阅读 1,694评论 0 0