admin 管理员组

文章数量: 887021


2024年2月24日发(作者:string light)

正则表达式入门教程

以下内容经正则表达式学习网授权

≈正则表达式是什么?≈

在使用电脑进行各种文字处理的时候,我们有时需要查找和匹配一些特殊的字符串,如邮箱地址、验证用户输入的密码是否包含了大小写字母和数字,查找HTML源文档中的所有web地址等等,这时我们就可以使用到正则表达式。

正则表达式本身是一个“字符串”,通过这个“字符串”去描述字符组成规则。如abbb、abbbb、abbbbb这三个字符串包都是以a字母开头a后面有一个b字母,而且b字母重复了3到5次。用正则表达式来描述就是ab{3,5},b{3,5}表示b字符重复3到5次。如果我们想匹配ababab这样的字符串,ab重复了3次,用正则表达式表示就是(ab){3},圆括号()是正则表达式中的分组。大家如果想亲自感受正则表达式的使用效果,可以打开正则表达式测试系统。

如以上实例所展示的,正则表达式为人们提供了一种简单易用的字符处理工具。它在目前主流的文字处理软件中都提供了良好的支持(不仅是编程软件,还有文字处理软件Uedit32、EditPlus,网页采集软件火车头等等),它具有很强的通用性,学好它,我们可以达一变应万变的效果。

≈正则表达式详解≈

像{},()这种在正则表达式中,具有特殊含义的字符称为元字符(metacharacter)。元字符是组成正则表达式的基本元素,在正则表达式经常使用的元字符不是很多,概念容易理解。大家只要花30来分钟学完我们的教程基本上就可以完全掌握。

为了您能更快速的掌握正则表达式,我们为您推荐一款方便的正则表达式在线测试工具“RegExr”,(RegExr由免费提供)。

保留字符

匹配字符本身

匹配字符数量

匹配字符位置

分组匹配

表达式选项

保留字符 (返回目录)

在正则表达式中,有一些字符在正则表达式中具有特殊含义被称保留字符,如*表示前一个元素可以重复零次或多次,要匹配“*”字符本身使用*,半角句号 . 匹配除了换行符外的所有字符,要匹配“.”使用 . 。

*和.中斜杠称为转义符,正则表达式中要匹配保留字符本身时都要加上转义符。同理要匹配反斜杠自身“”要使用,第一个斜杠是转义符,第二个是斜杠本身。匹配字符串“”

就为,第一个和第三个斜杠是转义符。

保留字

说明

保留字

说明

将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后匹配除了换行符(n)以外的任意引用、或一个八进制转义符。例如,

“n”匹配字符“n”。“n”匹配一个换行符。序列“”匹配“”而“(”则匹配“(”。

匹配输入字符串的结尾位置。要匹.

一个字符。要匹配小数点本身,请使用 "."

匹配输入字符串的开始位置。要匹$

配 "$" 字符本身,请使用 "$"

修饰匹配次数为 0 次或任意次。要^

配 "^" 字符本身,请使用 "^"

修饰匹配次数为至少 1 次。要匹配

*

匹配 "*" 字符本身,请使用 "*"

+

"+" 字符本身,请使用 "+"

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "?",当问号放在表达数量的元字符后面标记一个子表达式的开始和结束位时,匹配模式是非贪婪的。如ad+(贪?

会匹配 a123231 中的所有字符婪式下,表达式会尽可能多的匹配),但改成ad?就只会匹配a1了(非贪婪模式下,表达式会尽可能少的匹配)。

()

置。要匹配小括号,请使用 "(" 和

")"

用来自定义能够匹配 '多种字符'

修饰匹配次数的符号。要匹配大括{}

号,请使用 "{" 和 "}"

[]

的表达式。要匹配中括号,请使用

"[" 和 "]"

左右两边表达式之间 "或" 关系。|

匹配 "|" 本身,请使用 "|"

匹配字符本身 (返回目录)

元字符本身就可以代表了某个具体的字符,如:s可以匹配空格,w可以匹配数字、字母和下划线,d可以匹配数字,s、w、d如果改成大写的话就可以进行反向匹配,S匹配所有的非空格字符,W匹配所有非单词字符的字符,D匹配除了0-9外的所有字符。[]可以匹配取值范围,如[abc]匹配文本中的a或b或c。

正则表达式中不能直接匹配中文字符,必需字符编码形式来进行匹配,如“中华”这两个字符的十六进制unicode编码(编码查看工具)是0x4e2d和0x534e,正则表达式的书写形式为u4e2d和u534e(亲手试试)。

换行符在不同的系统和环境中有所有不,JavaScript测试环境中的换行符是n,而flash测试环境中的换行符是r,如果我们两行字,第一行的内容一个a字母,第二行的内容是个b字母,表达式的正确写法是javascript中为anb,而flash中写为arb。如果大家想更多的了解r与n可以看(n和r详细说明)。

元字符

描述 表达式 匹配举例

这是一个英文句号,匹配除换行符外(n).

的任意单个字符。

a.e

“nave”中的“ave”

“water”中的“ate”

“ID A1.3”中的“I”、w

匹配单词字符(字母、数字、下划线)。

w

“D”、“A”、“1”和“3”

匹配非单词字符(除了字母、数字、下划W

线的所有字符)。

W

“ID A1.3”中的“ ”、“.”

s

S

d

匹配单个空白字符。

匹配非空白字符。

匹配0-9这十个数字中的任意一个。

ws

sS

d

“ID A1.3”中的“D”

“int __ctr”中的“ _”

“4 = IV”中的“4”

“4 = IV”中的“ ”、“=”、D

匹配所有非数字字符。

D

“ ”、“I”和“V”

“gray”中的“a”

[ae]

匹配字符组中的任意一个字符。

[ae]

“lane”中的“a”和“e”

[^aei]

加上^表示反向匹配,意思是除了组内字符[^aei]

外的所有字符都会匹配。

方括号内加上“-”这个符号表示一个区间,“reign”中的“r”、“g”和“n”

[a-d如[a-d]匹配a,b,c,d这4个字符,也可以用[b-d]

]

[abcd]来表示。

0

匹配null空字符(Unicode编码:0x0000)。

匹配换行符(Unicode编码:0x000A),换行n

“abcdef”中的“bcd”

“rnThese arentwo

rn(w符 n 与回车符r 意思不同(n和r详细说+)

lines.”中的“rnThese”

明)。

f

匹配换页符(Unicode编码:0x000C)。

匹配回车符(Unicode编码:0x000D),回车[f]{2,“fff”中的“fff”

}

“rnThese arentwo

rn(w+)

lines.”中的“rnThese”

r

符r 与换行符 n 意思不同(n和r详细说

明)。

“item1titem2t”中的“item1t”和“item2t”

t

匹配制表符(Unicode编码:0x0009)。

(w+)t

v

匹配垂直制表符(Unicode编码:0x000B)。

匹配以八进制数 xxx 规定的字符。(字符编码历史和原理详解)

匹配以十六进制数dd规定的字符(dd恰好[v]{2,“vvv”中的“vvv”

}

w04“a bc d”中的“a b”和“c

0w

d”

xxx

xdwx2由2位数字组成)。(字符编码历史和原理详d 0w

解)

匹配以十六进制数 xxxx 规定的 Unicode“a bc d”中的“a b”和“c

d”。

uxwu0“a bc d”中的“a b”和“c

字符(Unicdoe由两个字节组成)。(字符编码xxx 020w

d”

历史和原理详解)

匹配字符数量 (返回目录)

元字符本身并不匹配字符,而是描述要匹配的字符数量。如:an*可以匹配a、an、annn。*匹配上一个或一组元素零次或多次。 an+可以匹配an、annn,不能匹配a。+匹配上一个或一组元素1次或多次。an?可以匹配a、an,不能匹配annn。?匹配上一个或一组元素零次或1次。an{3}只能匹配annn。{3}的意思是字符n必需重复3次。

元字符

描述 表达式 匹配举例

*

+

?

匹配上一个元素零次或多次

匹配上一个元素一次或多次

匹配上一个元素零次或一次

d*.

“.0”,“19.9”和“219.9”

d

"be+"been"中的"bee","bent"中的"be"

"

"rai?"ran"或"rain"

n"

{n}

匹配上一个元素恰好 n 次。

",d{3}"

“1,043.6”中的“,043”

“9,876,543”中的“,876”、",543"

{n,匹配上一个元素至少 n 次。

}

{n,m}

匹配上一个元素至少 n 次,但不多于 m 次。

匹配上一个元素零次或多次,但*?

次数尽可能少。

匹配上一个元素一次或多次,但+?

次数尽可能少。

匹配上一个元素零次或一次,但??

次数尽可能少。

"d{2“166”,“29”和“1930”

,}"

"d{3,5}"

“166”、“17668”

“193024”中的“19302”

d*?

“.0”,“19.9”和“219.9”

. d

"be+“been”中的“be”,“bent”中的“be”

?"

"rai?“ran”和“rain”

? n"

“1,043.6”{n}匹配前导元素恰好 n 次。

?

中的“,043”,",d{“9,876,543,210”中的“,876”、3}?"

“,543”和“,210”

{n,}?

匹配上一个元素至少 n 次,但次数尽可能少。

"d{2“166”,“29”和“1930”

,}?"

{n,匹配上一个元素的次数介于 n

“166”、“17668”

"d{3m},5}?"

?

和 m 之间,但次数尽可能少。

“193024”中的“193”、“024”

分组匹配 (返回目录)

正则表达式匹配abcabcabcabc(abc重复了四次)这样的内容时要使用到分组符号“圆括

号”,写成(abc){4},如果写成abc{4},就只匹配abcccc。同时分组还可以实现非捕获组、先行断言、在javascrip的replace函数(应用实例)、Apache(web服务器)ULR重写模块等应用中还可以传递参数(应用实例)。

关于先行断言这个概念看起来很复杂,但实际上就是在表达式的左边或右边设置一个匹配条件,满足条件的表达式才开始匹配,我们来看个实例 ,如果我们想匹配 "b:123;b:456"

中有所有数字字符串。由于他们都是以"b:"开头的,所以我们可以使用(<=b:)d+,其中(<=b:)就是判断的条件(正则表达式中叫先行断言)。

元字符 描述 表达式 匹配举例

(子表达式)

(?:子表(ab){3,“ababab”,“abababab”,“aba将一个字符串进行组合,参与匹配。

5}

bababab”

定义非捕获组。

达式)

Write(“ine()”中的?:Line)?

“WriteLine”

零宽度正预测先行断言,应用说明:(?=子exp1(?=exp2)表示exp1的右边必需表式)

达“He is. The dog ran. The

w+(?=sun is out.”中的“is”、“ran”.)

包含内容exp2,同时exp2不做为匹配和“out”

结果。

零宽度负预测先行断言。应用说明:(?!子exp1(?!exp2)表示exp1的右边不能表式)

结果。

零宽度正回顾后发断言。应用说明:(?<=子表式)

“1851 1999 1950 1905

(?<=exp1)exp2表示exp2的左边必需(?<=19)d{2}2003”中的“99”、“50”和达包含内容exp1,同时exp1不做为匹b

“05”

配结果。(JavaScript不支持)

达包含内容exp2,同时exp2不做为匹配b(?!un)w+b

“unsure sure unity used”中的“sure”和“used”

零宽度负回顾后发断言。应用说明:(?

配结果。(JavaScript不支持)

(?<=exp1)exp2表示exp2的左边不能(?

)d{2}达2003”中的“51”和“03”

包含内容exp1,同时exp1不做为匹b

匹配字符位置 (返回目录)

元字符本身并不匹配字符,而是描述了要匹配的元素的位置,如:^a匹配an中的a和apple中的a,但不匹配span中的a,^表示要匹配的a字符必需位于字符串的开头。banb只会匹配单词an,不匹配banana中的an,两个b分别代表了单词前面和后面的分割符。

元字符

描述

表达式

匹配举例

单词分割符, 这里的单词指的是由数字、字母、下划线所组成的字符串。如abc、a_djj、a01a等,a,f和a j都不是单词,因b

ba.匹配"an"*nb

"aoon","a_n","a123n"

为它们中间包括了逗号或空格这些非单词字符(除了数字、字母、下划线)以外的字符。

匹配字符串的开头,加上m选项就会匹^

配行的开头。

匹配字符串行结尾,加上m选项就会匹$

配行的结尾。

a$

"a"。

^abc

匹配"0abcdef"中的"abc"

匹配"banana"中的最后一个匹配"abcdef"中的"abc",不、正则表达式选项 (返回目录)

正则表达式选项可以改变匹配过程中的一些默认的效果,例如正常情况下,正则表达式

匹配时会区分字母的大小,A{2}就只匹配AA,不匹配aa,但使用i选项后,AA和aa都可以匹配。

在这里我们主要介绍一下JavaScript中的正则表达式选项。其他系统还有可能包含其他的选项,具体可以参考各系统自带的文档,或者本网站中的正则表达式元字符表大全。

正则选项

描述

JavaScript实列

匹配举例

i

不区分大小写。

全局匹配。无此选项情况下,表达式an匹配/good/i good,GOOD

banbana中的/an/g

两个an

详细介g

banbana中的第一个an。有g就都会匹配。

m

多行匹配。改变元字符^和$的效果(详细介绍)。

详细介绍


本文标签: 匹配 字符 编码 字符串 应用