正则表达式学习之一:基本语法

来源:互联网 发布:中金数据系统怎么样 编辑:程序博客网 时间:2024/05/17 22:46

准备把这篇文章翻译一下,学习一下正则表达式的基本语法。看的头大了,这玩意用的时候还是要边查边写的好。

----------------------------------------

简介

正则表达式是为了描述一个字符串的某个特征,然后用它来匹配另外一个字符串。举个例子,模式“ab+”意味着“一个’a’”和至少一个’b’,所以”ab”,”abb”,abbbbbbb”都跟这个模式匹配。

正则表达式用于:(1) 判断一个字符串是否跟一个模式匹配,譬如电邮地址; (2)在整个文本中找到符合给定模式的子字符串;(3)对一段文本做复杂的替换操作

正则表达式的语法学习非常简单,一些抽象概念也很容易理解。许多相关文章没有将正则表达式的概念从简单到抽象一步步介绍,所以很多人觉得学习起来很困难。另一方面,每个正则表达式引擎都会描述它独特的功能,而这部分独特功能却不是我们最初应该学习的。

1.      正则表达式基本语法

1.1         一般字符

字母、数字、下划线、无特殊定义的标点就是“一般字符”。当正则表达式与一个字符串匹配时,一个一般字符跟相同的字符匹配。

例子1:当模式”c”与字符串”abcde”测试匹配时,匹配结果:成功,子串匹配”c”

例子2:当模式“bcd”与字符串“abcde”测试匹配时,匹配结果:成功,匹配字串”bcd”

1.2         简单转义字符

我们知道的非打印字符:

表达式

匹配

/r, /n

回车,换行符

/t

Tab

//

“/”

在正则表达式语法中有特殊定义的一些标点符号。为了匹配这些字符,需要在模式中加入”/”。举个例子:^,$有特殊定义,所以我们需要用”/^””/$”来匹配它们。

表达式

匹配

/^

“^”

/$

“$”

/.

“.”

转义字符的匹配效果跟一般字符一样,也是匹配它们自身字符。

例如:模式”/$d”匹配字符串”abc$de”

1.3         匹配字符集中任意字符的表达式

一些表达式能匹配字符集中的任意字符。比如”/d”就能匹配任意的数字。每个这样的表达式每次只能匹配一个,虽然它们能匹配一组字符中的任意字符。

表达式

匹配

/d

任意数字,0~9

/w

任意字母,数字,下划线 A~Z, a~z, 0~9, _

/s

空格,tab,换行,回车,换页符中的任意一个

.

除了换行符(/n)之外的任意字符

例如:模式”a.d”匹配”aaa100”,匹配成功,匹配字串”aa1”

1.4         用于匹配许多字符集中的任意一个字符的自定义表达式

使用方括号([])的表达式表达式可以包含一系列的字符,它能匹配任意的一个。使用[^ ]包含一系列的字符,它能匹配除开所包含的字符集外的字符。

表达式

匹配

[ab5@]

“a” “b” “5” “@”

[^abc]

匹配除了”a” “b” “c”其余的字符

[f-k]

“f” “k”之间的字符

[^A-F0-3]

不处于“A”~”F”,”0”~”3”的所有字符

例如:模式”[bcd][bcd]”跟字符串”abc123” 匹配成功,匹配字串”bc”

例如:模式”[^abc]”跟字符串”abc123”,匹配成功,匹配子串”1”;

1.5         用于数量匹配的特殊表达式

前面介绍的所有表达式只能匹配一次字符。如果一个表达式后面跟随一个数字,它就能匹配多次。

例如:我们可以使用模式”[bcd]{2}”来代替”[bcd][bcd]”

表达式

匹配

{n}

匹配n次,例如”/w{2}”等价于”/w/w”;”a{5}”等价于”aaaaa”

{m, n}

至少匹配n次,但不多于m次:”ba{1,3}” 匹配”ba”, “baa”, “baaa”

{m,}

匹配至少m次:”/w/d{2,}””a12”,”_456” “M12344”..

?

匹配1次或者0次,等价于{0, 1}: “a[cd]?””a”, “ac”, “ad”

+

匹配一次或者多次,等价于{1,}:”a+b””ab”, “aab”, “aaab”

*

匹配0次或者多次,等价于{0,}:”/^*b””b”,”^^^b”…

例如:模式”/d+/.?/d*””I tcosts &12.5”匹配,结果成功,匹配子串”12.5”;

例如:模式”go{2,8}gle””Ads bygooooogle”匹配,结果成功;匹配子串”gooooogle”

1.6         巨有抽象功能的特殊标点

一些标点在模式中具有特殊的功能:

表达式

匹配

^

匹配字符串的开头

$

匹配字符串的结尾

/b

匹配边界内的字符??

举例1:模式”^aaa”跟字符串“xxxaaa xxx”,匹配失败。因为”^”必须匹配字符串的开头。

2:模式”aaa$”跟字符串”xxxaaa xxx”,匹配失败、

3:模式”./b.”跟字符串”@@@abc”,匹配成功,匹配字串”@a”.

                “/b”类似于”^””$”的交集,它不跟任何字符匹配,但是它要求一个”/w”在一边,一个非”/w”字符在另一边

4:模式”/bend/b”跟字符串”weekend,endfor,end”匹配,结果成功,匹配子串”end”,开始位置15,结束位置18  ??

一些特殊标点能嵌套在其他子模式中起作用:

模式

匹配

|

二选一,左匹配或者右匹配

( )

(1)    当子模式

(2)    子模式匹配结果能单独检索

: 当模式”Tom|Jack”匹配字符串”I’mTom, he is Jace”,匹配成功,子串”Tom”开始位置4,结束位置7; 当匹配下一个时,匹配成功,子串”Jack”,开始位置15,结束位置19

例:当模式”(go/s*)+”匹配字符串”Let’sgo go go!”,匹配成功;子串”go go go”:开始位置6,结束位置14

例:当模式¥(/d+/.?/d*)”与字符串”$10.9, ¥20.5匹配,匹配成功;子串 ¥20.5”:位置开始6,结束10。子模式”()”的匹配记过是”20.5”

 

下一篇将是一些常规表达式中的高级语法

原创粉丝点击