最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

世界观焦点:解放生产力!一文教你快速入门正则表达式

来源:博客园

一、概述

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

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


(资料图片仅供参考)

正则表达式不要背

二、基本语法

单个字符数量位置
\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。

「示例」

varstr="Googlerunoobtaobaorunoob";varn1=str.match(/runoob/);//查找第一次匹配项varn2=str.match(/runoob/g);//查找所有匹配项varstr="runoobgoogle\ntaobao\nrunoobweibo";varn1=str.match(/^runoob/g);//匹配一个varstr="google\nrunoob\ntaobao";varn1=str.match(/google./);//没有使用s,无法匹配\nvarn2=str.match(/runoob./s);//使用s,匹配\nvarn2=str.match(/^runoob/gm);//多行匹配

三、子表达式

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

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

「正则表达式」

(ab){2,}

「匹配结果」

ababab

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

「正则表达式」

(19|20)\d{2}

「匹配结果」

1.19002.20103.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.12.00.00.00.003.555.555.555.555

四、回溯引用

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

「应用」

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

「正则表达式」

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

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

「匹配结果」

1.

x

2.

x

替换

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

「应用」

修改电话号码格式。

「文本」

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.abc3.(abc

前后查找条件

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

「正则表达式」

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

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

「结果」

1.111112.22222-3.33333-4444

关键词: 正则表达式 子表达式 不区分大小写