准备把这篇文章 翻译一下,学习一下正则表达式的基本语法。看的头大了,这玩意用的时候还是要边查边写的好。
----------------------------------------
简介
正则表达式是为了描述一个字符串的某个特征,然后用它来匹配另外一个字符串。举个例子,模式“ 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 t costs &12.5”匹配,结果成功,匹配子串 ”12.5”;
例如:模式 ”go{2,8}gle”跟 ”Ads by gooooogle”匹配,结果成功;匹配子串 ”gooooogle”
1.6 巨有抽象功能的特殊标点
一些标点在模式中具有特殊的功能:
表达式 | 匹配 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
/b | 匹配边界内的字符 ?? |
举例 1:模式 ”^aaa” 跟字符串 “xxx aaa xxx”,匹配失败。因为 ”^”必须匹配字符串的开头。
例 2:模式 ”aaa$”跟字符串 ”xxx aaa xxx”,匹配失败、
例 3:模式 ”./b.”跟字符串 ”@@@abc”,匹配成功,匹配字串 ”@a”.
“/b”类似于 ”^”跟 ”$”的交集,它不跟任何字符匹配,但是它要求一个 ”/w”在一边,一个非 ”/w”字符在另一边
例 4:模式 ”/bend/b”跟字符串 ”weekend,endfor,end”匹配,结果成功,匹配子串 ”end”,开始位置 15,结束位置 18 ??
一些特殊标点能嵌套在其他子模式中起作用:
模式 | 匹配 |
| | 二选一,左匹配或者右匹配 |
( ) | (1) 当子模式 (2) 子模式匹配结果能单独检索 |
例 : 当模式 ”Tom|Jack”匹配字符串 ”I’m Tom, he is Jace”,匹配成功,子串 ”Tom”开始位置 4,结束位置 7; 当匹配下一个时,匹配成功,子串 ”Jack”,开始位置 15,结束位置 19。
例:当模式 ”(go/s*)+”匹配字符串 ”Let’s go go go!”,匹配成功;子串 ”go go go”:开始位置 6,结束位置 14。
例:当模式 ”¥ (/d+/.?/d*)”与字符串 ”$10.9, ¥20.5 ”匹配,匹配成功;子串 ” ¥20.5 ”:位置开始 6,结束 10。子模式 ”()”的匹配记过是 ”20.5”。
下一篇将是一些常规表达式中的高级语法