初学JavaScript正则表达式

学如逆水行舟,不进则退

什么是正则表达式

Regular Expression使用单个字符串来描述、匹配一系列符合某种规则的字符串。
简单来说就是按照某种规则去匹配符合条件的字符串。

举个栗子,我们要查找当前目录的所有txt文件,就可以通过正则表达式来完成:
find ./ -name *.txt
当然这只是个很简单的例子。
其实真正用到的有可能是这个样子的:
^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$
这是验证邮箱的一个规则,所以想要在实际工程中运用,还需要深入学习学习。

而且有大神写出了一个正则表达式的可视化工具,可以方便的查看你的正则表达式的意思:
点击链接:Regexper
还有一款工具可以实时显示的也很不错:
点击链接:Regulex


通配符

下面我们开始学习一些通配符,看看他们都是什么意思。
\b   WordBoundary,单词的边界;
\d   Digit,数字;
.     AnyChar,任意字符;
^    Start开头;
$    End结尾;
{4}   表示重复4次;
[/-]   / 或者 - 其中一个,中括号表示或;
()   表示分组;
$1   表示提取前面括号里的分组内容,按顺序排列$1 $2 $3……
例如:
^\d{4}[/-]\d{2}[/-]\d{2}$
匹配的就是像2017/01/07或者2017-01-07这样的时间格式。

RegExp对象

JavaScript中通过内置对象RegExp来支持正则表达式。
而实例化RegExp对象有两种方法:

  • 字面量
  • 构造函数

第一种方法:

var reg=/\bis\b/g;
"He is a boy,this is a dog.".replace(reg,"IS")
//先声明了一个变量存储表达式,然后替换字符串里所有的is为IS
//表达式中的g表示global全局

第二种方法:

var reg = new RegExp("\\bis\\b","g");
"He is a boy,this is a dog.".replace(reg,"IS")
//在js中使用\需要转义,所以再加一个\;

修饰符

  • g :global全文搜索,不加的话默认匹配第一个;
  • i :ignore case 忽略大小写,默认大小写敏感;
  • m :multiple lines多行搜索;

元字符

元字符是在正则表达式中有特殊含义的非字母字符。
* + ? $ ^ . | \ () [] {}

字符 含义
\t 水平制表符
\v 垂直制表符
\n 换行符
\r 回车符
\0 空字符
\f 换页符
\cX 与X对应的控制符(ctrl+X)

字符类

我们可以用[]来构建一个简单的类,所谓类就是符合某种规则的一类字符,而不是特指的单个字符;
例如:
"a1b2c3d4".replace(/[abc]/g,"x")就会得到:"x1x2x3d4"
字符类取反
我们可以使用元字符^创建反向类/负向类;
反向类表示不属于某类的内容;
比如[^abc]表示不是a或b或c的内容;
例如:
"a1b2c3d4".replace(/[^abc]/g,"x")结果是axbxcxxx

范围类

正则表达式还提供范围类;
我们可以使用[a-z]来表示从a到z的任意字符;
在[]组成的类内部还可以连写像这样[a-zA-Z0-9]
举个几栗子:
"a1b2c3d4xYz".replace(/[a-z]/g,"x")结果是x1x2x3x4xYx
"a1b2c3d4XYZ".replace(/[a-zA-Z]/g,"x")结果是x1x2x3x4xxx
"2017-01-07".replace(/[0-9]/g,"x")结果是xxxx-xx-xx
"2017-01-07".replace(/[0-9-]/g,"x")结果是xxxxxxxxxx

预定义类

正则表达式还提供一些预定义类来匹配常见的字符类

字符 等价类 含义
. [^\r\n] 除了回车和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白符
\S [^\t\n\x0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符(字母、数字、下划线)
\W [^a-zA-Z_0-9] 非单词字符

例如:匹配一个 “ab+数字+任意字符” 的字符串
只需要这样:ab\d.就可以解决了。
当然还有边界字符:

字符 含义
^ 以×××开始
$ 以×××结束
\b 单词边界
\B 非单词边界

量词

字符 含义
? 出现零次或一次(最多一次)
+ 出现一次或多次(最少一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 最少出现n次

举个栗子:
\d{20}\w?\d\w+\d*\d{3}\w{3,5}\d{3,}什么意思呢,来看图:

图片.png

正则表达式的贪婪和非贪婪模式

贪婪模式顾名思义就是尽可能多的匹配,知道匹配失败为止。
例如:
"12345678".replace(/\d{3,6}/g,"x")结果是:"x78"
非贪婪模式就是尽可能少的匹配,一旦匹配成功就不再进行匹配。
怎么使用非贪婪模式呢?很简单,在量词后面加上“?”就可以了。
例如:
"12345678".replace(/\d{3,6}?/g,"x")结果是:"xx78"

分组

我们使用()可以到达分组的效果,使量词可以作用于整个分组而不是紧挨的单个字符。
例如:
"a1b2c3d4".replace(/[a-z]\d{3}/g,"x")结果是:"xd4"

使用|可以达到或的效果

反向引用

如果我们想把2017-01-07这样一个字符串替换为01/07/2017这样。
可以用$和()来实现
"2017-01-07".replace(/(\d{4})-(\d{2})-(\d{2})/g,"$2/$3/$1")
结果是:"01/07/2017"
分组默认是自动排序的,如果不想被分组呢,只需要在括号里面加上“?:”就可以忽略该分组了:

图片.png

前瞻

正则表达式从文本的头部向尾部进行解析,文本的尾部方向,称为“前”。
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后瞻方向相反。
需要注意的是Javascript并不支持后瞻。
符合和不符合特定断言分别称为正向/肯定匹配和负向/否定匹配。

名称 正则
正向前瞻 exp(?=assert)
负向前瞻 exp(?!assert)

再来个栗子:
"a2*34v8".replace(/\w(?=\d)/g,"x")结果:"x2*x4x8"
"a2*34v8".replace(/\w(?!\d)/g,"x")结果:"ax*3xxx"


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

推荐阅读更多精彩内容