javaScript的正则表达式详解

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。使用好正则表达式可以节省大量的代码。

先从简单的案例体验下正则

/abc/.test("51abcd23");//true
/\d\d\d/.test("12ab");//false
/\d\d\d/.test("123ab");//true

new RegExp("Frankin").test("hello,Frankin");//true

以上定义了两种正则调用的方法,当校验规则是字符串的时候很好理解,就是被校验的字符串里是否含有校验规则的字符串,如果包含的话返回true,反之校验失败返回false,并且大小写敏感,而\d这种特殊的语句规则又是什么呢?\d其实代表匹配0-9的数字,而这种匹配规则还有很多,我们可以看下图。

常用元字符串:

语法 描述 例子
. 任意字符(除换行符外:\n,\r,\u2028 or \u2029) /.../.test('1a@');
\d 数字0-9 /\d\d\d/.test('123');
\D 非\d,即不是数字0-9的字符 /\D\D\D/.test('ab!');
\w 数字0-9或者字母a-z及A-Z(大小写),或下划线 /\w\w\w\w/.test('aB9_');
\W 非\w /\w\w\w/.test('@!#');
\s 空格符、TAB、换页符、换行符 /\sabc/.test(' abc');
\S 非\s
\t \r \n \v \f tab 回车 换行 垂直制表符 换页符

范围符号:

语法 描述 例子
[...] 字符范围 [a-z] [0-9] [A-Z0-9a-z_]
[^...] 字符范围以外 [^a-z] [^abc]
^ 行首 ^Hi
$ 行尾 test$
\b 零宽单词边界 \bno
\B 非\b

这里可能\b 零宽单词边界比较难理解,这里重点解释下

当我们需要把一句 This is a test这句话的is 替换成 IS时,如果直接匹配is,会把This后面的is也给替换掉,这时使用单词边界\bis\b来匹配,便可以只匹配is而不匹配This了

当我们刚好要匹配^或者$这些带有范围符号规则的字符时,该怎么办呢?

这时就需要用转义字符\来声明 不做别的范围匹配作用 例如^

/\^abc/.test('^abc');//true

分组:

语法 描述 例子
(x) 分组,并记录匹配到的字符串 /(abc)/
\n 表示使用分组符(x)匹配到的字符串 /(abc)\1/.test('abcabc');
(?:x) 仅分组 /(?:abc)(def)\1/.test('abcdefdef');

这里讲解下(x)和(?:x)的区别

当使用(x)分组时,使用\n重新匹配第n个分组

当只想将复杂的表达式分组,而不记录被/n调用时,使用(?:x)便不会记录匹配到的字符串

/(abc)(def)\1/.test('abcdefabc');//true
/(?:abc)(def)\1/.test('abcdefabc');//false
/(?:abc)(def)\1/.test('abcdefabc');//true

'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1');
//"11/25/2016"

重复:

语法 描述 例子
x* x+ 重复次数>=0 重复次数>0 贪婪算法 正则表达式: abc*将匹配ab、abc、abcccccc<br />正则表达式:abc+将匹配abc、abccccc、却匹配<u>ab</u>
x*? x+? 同x*,x+,非贪婪算法 正则表达式: abc*?在字符串abcccccc将匹配ab<br />正则表达式:abc+?将匹配abc
x? 出现0或1次
x|y x或者y x|y匹配x,也匹配y<br />再比如:ab|cd|ef匹配ab或cd或e f
x{n} x{n,} x{n,m} 重复n次,重复>=n次,重复次数x满足:n<=x<=m x{5}匹配xxxxxoo,不匹配xxo<br />x{1,3}匹配x,xx,xxx

前瞻

前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言

js不支持后顾

名称 正则 含义
正向前瞻 exp(?=assert)
负向前瞻 exp(?!assert)
正向后顾 exp(?<=assert) javaScript不支持
负向后顾 exp(?<!assert) javaScript不支持
'a2*3'.replace(/\w(?=\d)/g,'X');
//"X2*3"
'a2*34v8'.replace(/\w(?=\d)/g,'X');
//"X2*X4X8"
'a2*34vv'.replace(/\w(?=\d)/g,'X');
//"X2*X4vv"
'a2*34vv'.replace(/\w(?!\d)/g,'X');
//"aX*3XXX"

Flag、RegExp对象属性

  • global--g (全文匹配)
  • IgnoreCase--i (忽略大小写)
  • Multiline--m. (多行搜索)
  • source (正则表达式的文本字符串)
  • lastIndex (是当前表达式匹配内容的最后一个字符的下一个位置)
var reg = /\bis\b/;
//或
var reg = new RegExp('\\bis\\b');

'He is a boy.This is a dog'.replace(reg,'IS')

//"He IS a boy.This is a dog"

//添加g 全文匹配,否则匹配到第一个后停止
var reg = /\bis\b/g;
//或
var reg = new RegExp('\\bis\\b',g);
'He is a boy.This is a dog'.replace(reg,'IS')
//"He IS a boy.This IS a dog"

//IgnoreCase用法
'This Is a dog'.replace(/is/g,'Q')
//"ThQ Is a dog"
'This Is a dog'.replace(/is/gi,'Q')
//"ThQ Q a dog"


//Multiline用法
const mulStr = "@123
                                @456
                                @789"
mulStr.replace(/^@\d/g,'X');
//  "X23
//  @456
//  @789"
mulStr.replace(/^@\d/gm,'X');
//  "X23
//  X456
//  X789"

RegExp对象方法

  • compile
  • exec
  • test
  • toString
/abc/.exec("abcdef"); // "abc" 此方法返回匹配到的字符串,类似字符串的match方法
/abc/.test("abcde"); //true   此方法返回boolean值
/abc/.toString();// "/abc/"
var reg = /abc/; 
reg.compile("def"); //compile修改正则的属性
reg.test("def");//true

string类型与正则相关的方法

  • String.prototype.search 检索正则规则匹配的字符串所在的索引
  • String.prototype.replace 替换正则匹配的值
  • String.prototype.match 返回一个数组,匹配正则规则的值组成的数组
  • String.prototype.split 字符串根据正则分割
"abcabcdef".search(/(abc)/1/);//0
"aabbbbcc".replace(/b+?/,1); //aa1bbbcc
"aabbbbcc".match(/b+/);//["bbbb"]
"aabbbbccbbaa".match(/b+/g);//["bbbb","bb"]
"aabbbbccbbaa".split(/b+/);//["aa","cc","aa"]

正则可视化工具

https://regexper.com

该站点有可能会被墙,为了稳定的访问,我们也可以在github下clone,进行本地部署

https://github.com/javallone/regexper-static

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

推荐阅读更多精彩内容