解放生产力!一文教你快速入门正则表达式

一、概述

正则表达式一般用于文本内容的查找和替换,在日常工作中还可用来校验用户的输入是否符合自定义的规则。

正则表达式是匹配模式,要么匹配字符,要么匹配位置

图片

正则表达式不要背

二、基本语法

单个字符数量位置
\d 匹配数字* 0 个或者更多^一行的开头
\w 匹配 word(数字、字母)+ 1 个或更多,至少 1 个$ 一行的结尾
\W 匹配**「非」**word(数字、字母)? 0 个或 1 个,一个 Optional\b 单词"边界"(word bounds)
\s 匹配 white space(包括空格、tab 等){min,max}出现次数在一个范围内( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
\S 匹配**「非」**white space(包括空格、tab 等){n}匹配出现 n 次的{ 标记限定符表达式的开始。要匹配 {,请使用 {。
. 匹配任何,任何的字符
|指明两项之间的一个选择。要匹配 |,请使用 \|

「[ ]」 定义一个字符集合

  • 0-9、a-z 定义了一个**「字符区间」**,区间使用 ASCII 码来确定,字符区间在 [ ] 中使用。若没有-连字符,则取的雨元素从[ ]中取

  • 「在[]中,特殊字符不需要转义,可以直接使用」

  • 「^」 在 [ ] 中代表取非操作。

「常见示例:」

  • 身份证号(15 位、18 位数字),最后一位是校验位,可能为数字或字符 X:**(\d15}$)(\d{18)**

  • 数字:**^[0-9]*$**

  • 中文字符的正则表达式:**[\u4e00-\u9fa5]**

  • Email 地址:**^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$**

「修饰符」

下表列出了正则表达式常用的修饰符:

修饰符含义描述
iignore - 不区分大小写将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
gglobal - 全局匹配查找所有的匹配项。
mmulti line - 多行匹配使边界字符 「^」 和 「$」 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s特殊字符圆点 「.」 中包含换行符 「\n」默认情况下的圆点 「.」 是匹配除换行符 「\n」 之外的任何字符,加上 「s」 修饰符之后, 「.」 中包含换行符 \n。

「示例」

var str="Google runoob taobao runoob";
var n1=str.match(/runoob/);   // 查找第一次匹配项
var n2=str.match(/runoob/g);  // 查找所有匹配项

var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g);   // 匹配一个

var str="google\nrunoob\ntaobao";
var n1=str.match(/google./);   // 没有使用 s,无法匹配\n
var n2=str.match(/runoob./s);  // 使用 s,匹配\n
var n2=str.match(/^runoob/gm);  // 多行匹配

三、子表达式

使用 「( )」 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。

子表达式可以嵌套,但是嵌套层次过深会变得很难理解。

「正则表达式」

(ab){2,}

「匹配结果」

ababab

「|」 代表或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。

「正则表达式」

(19|20)\d{2}

「匹配结果」

1. 1900
2. 2010
3. 1020

「应用」

匹配 IP 地址。

IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的:

  • 一位数字

  • 不以 0 开头的两位数字

  • 1 开头的三位数

  • 2 开头,第 2 位是 0-4 的三位数

  • 25 开头,第 3 位是 0-5 的三位数

「正则表达式」

((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))

「匹配结果」

1. 192.168.0.1
2. 00.00.00.00
3. 555.555.555.555

四、回溯引用

回溯引用使用 「\n」 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。

「应用」

匹配 HTML 中合法的标题元素。

「正则表达式」

\1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。

<(h[1-6])>\w*?<\/\1>

「匹配结果」

1. <h1>x</h1>
2. <h2>x</h2>

替换

需要用到两个正则表达式。

「应用」

修改电话号码格式。

「文本」

313-555-1234

「查找正则表达式」

(\d{3})(-)(\d{3})(-)(\d{4})

「替换正则表达式」

在第一个子表达式查找的结果加上 () ,然后加一个空格,在第三个和第五个字表达式查找的结果中间加上 - 进行分隔。

($1) $3-$5

「结果」

(313) 555-1234

大小写转换

元字符说明
\l把下个字符转换为小写
\u把下个字符转换为大写
\L把\L 和\E 之间的字符全部转换为小写
\U把\U 和\E 之间的字符全部转换为大写
\E结束\L 或者\U

「应用」

把文本的第二个和第三个字符转换为大写。

「文本」

abcd

「查找」

(\w)(\w{2})(\w)

「替换」

$1\U$2\E$3

「结果」


aBCd

五、前后查找

前后查找规定了匹配的内容首尾应该匹配的内容,但是又不包含首尾匹配的内容。

向前查找使用 「?=」 定义,它规定了尾部匹配的内容,这个匹配的内容在 ?= 之后定义。所谓向前查找,就是规定了一个匹配的内容,然后以这个内容为尾部向前面查找需要匹配的内容。向后匹配用 ?<= 定义(注: JavaScript 不支持向后匹配,Java 对其支持也不完善)。

「应用」

查找出邮件地址 @ 字符前面的部分。

「正则表达式」

\w+(?=@)

「结果」

「abc」 @qq.com

对向前和向后查找取非,只要把 = 替换成 ! 即可,比如 (?=) 替换成 (?!) 。取非操作使得匹配那些首尾不符合要求的内容。

六、嵌入条件

回溯引用条件

条件为某个子表达式是否匹配,如果匹配则需要继续匹配条件表达式后面的内容。

「正则表达式」

子表达式 ( \ ( ) 匹配一个左括号,其后的 ? 表示匹配 0 个或者 1 个。?(1) 为条件,当子表达式 1 匹配时条件成立,需要执行 ) 匹配,也就是匹配右括号。

(\()?abc(?(1)\))

「结果」

1. (abc)
2. abc
3. (abc

前后查找条件

条件为定义的首尾是否匹配,如果匹配,则继续执行后面的匹配。注意,首尾不包含在匹配的内容中。

「正则表达式」

?(?=-) 为前向查找条件,只有在以 - 为前向查找的结尾能匹配 \d{5} ,才继续匹配 -\d{4} 。

\d{5}(?(?=-)-\d{4})

「结果」

1. 11111
2. 22222-
3. 33333-4444
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐红茶

欢迎随意打赏,公众号欢迎关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值