标签:
0. 注: 不同语言中的正则表达式实现都会有一些不同。下文中的代码示例除特别说明的外,都是使用JS中的正则。
1. 正则表达式关键字
( ) [ ] { } . * ^ $ + ? \
2. 正则表达式最常用语法
PS: pattern表示一个正则表达式
字符 |
说明 |
\ |
转义符 |
^ |
表示非,或匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 |
$ |
匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 |
{n} |
n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 |
{n,} |
n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效于“o+”。“o{0,}”等效于“o*”。 |
{n,m} |
M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。‘o{0,1}‘ 等效于 ‘o?‘。注意:您不能将空格插入逗号和数字之间。 |
* |
零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。 |
+ |
一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。 |
? |
零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 |
.(小数点) |
匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。 |
x|y |
匹配 x 或 y。例如,‘z|food‘ 匹配“z”或“food”。‘(z|f)ood‘ 匹配“zood”或“food”。 |
[xyz] |
字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。 |
[^xyz] |
反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。 |
[a-z] |
字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。 |
\d |
数字字符匹配。等效于 [0-9]。 |
\D |
非数字字符匹配。等效于 [^0-9]。 |
\n |
换行符匹配。等效于 \x0a 和 \cJ。 |
3. 捕获与不捕获
(pattern) |
匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。 |
(?:pattern) |
匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“or”字符 (|) 组合模式部件的情况很有用。例如,‘industr(?:y|ies) 是比 ‘industry|industries‘ 更经济的表达式。 |
(?=pattern) |
执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,‘Windows (?=95|98|NT|2000)‘ 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
(?!pattern) |
执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,‘Windows (?!95|98|NT|2000)‘ 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
在各种编程语言中,可以捕获匹配到的字符串,如在Js中可以用RegExp.$N,N>=1,来获取匹配的字符串。如果使用了不捕获模式,则即使正确匹配也不会捕获匹配结果。
其中后面3个都是不捕获匹配。
上述表达式中还包含正向预匹配和反向预匹配,需要注意的是,IDE的查找、替换功能中貌似不能使用, 但以上几个功能在JS和C#中都已经实现,可以使用。
4. 贪婪与非贪婪匹配模式
正则表达式匹配时,默认是使用贪婪模式。如果在修饰匹配次数的符号后加一个问号(?),则表示使用非贪婪模式。顾名思义,贪婪模式会匹配尽量多的字符,非贪婪模式会在一匹配到所需字符就停止匹配。
如下表达式为贪婪模式:
var reg = /([a-z]+)/;
如下表达式为非贪婪模式:
var reg1 = /([a-z]+?)/;
当上述两个正则表达式匹配一下字符串后:
var str = "abcdefg";
reg.test(str); console.log(RegExp.$1);
reg1.test(str); console.log(RegExp.$1);
捕获到的结果分别是:
贪婪模式:
"abcdefg"
非贪婪模式:
"a"
5. 正则表达式匹配模式
a) 只匹配一次, 正则的默认匹配模式, 在输入字符串中匹配成功一次就停止匹配。
b) 全局模式, 在输入字符串中遍历,找出所有正确匹配的字符串
c) 忽略大小写, 正则默认会区分大小写进行匹配,可开启忽略大小写匹配。
d) 单行模式, 正则的默认匹配模式,如果输入的文本包含\n\r等换行符时,正则的关键字$会匹配字符串结束为止。
e) 多行模式, MultiLine模式,开启后,关键字^和$可以匹配每行的开始和结束,每行的开始结束根据换行符(\n\r)决定。
6. 正则表达式语法参考网址
http://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx
http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
7. 正则使用场景
a) 编程语言:
i. JAVASCRIPT:
可以用/abc/g或new RegExp(“abc”,”g”)来声明正则表达式
其中第一种写法,在后面一个斜杠(/)添加字符来指定匹配模式,第二种写法,在第二个参数中添加字符来指定匹配模式。 各字符对应的匹配模式如下:
g : 全局模式
I: 忽略大小写
m: 多行模式
其中“区分大小写”、“只匹配一次”与“单行模式”为JS正则的默认模式,若要使用,只需要不设置忽略大小写、全局模式或多行模式即可。
如果需要同时启用全局、忽略大小写和多行模式,可以用如下写法:
/abc/gim
或
new RegExp(“abc”,”gim”);
其中”g”、”I”、”m”的顺序没有影响。
ii. C#:
需要引用System.Text.RegularExpressions命名空间,使用
b) IDE
i. Visual Studio
ii. SQL Server
iii. Vim、Emacs、Sublime Text等等
7.1 JS
在JS中声明正则表达式有2种方式
var reg = /.*/;
var reg = new RegExp(“.*”);
JS的正则默认为只匹配一次。
要获取上一次正则匹配捕获到的结果,可以用RegExp.$N, N为大于等于1的正整数,按顺序表示匹配到的结果。
7.2 C#
在C#中使用,正则,需要引用System.Text.RegularExpressions;。
创建正则的代码如下:
Regex reg = new Regex("Windows (?!95|98|NT|2000)");
C#的正则默认为全局模式。
new Regex方法有3个重载, 第二个参数是一个枚举,可以指定匹配模式,这里包含多个模式,常用的有IgnoreCase(忽略大小写),Multiline(多行模式),其中有Singleline,(单行模式)不需要指定,默认就是单行模式
8. IDE(Visual Studio、SQL Server)
如上文所述, 微软的IDE中暂不支持预匹配功能。
在Visual 2010或以下,和SQL SERVER中要使用正则表达式进行查找或替换,只需要勾选窗口中底部的“使用”复选框并选择"正则表达式"即可.
在Visual 2012或以上,要要使用正则,只需要开启查找、替换功能中的“*.”的选项即可。
在微软的IDE中(VS和SQL SERVER),在替换功能中,要使用匹配并捕获到的字符串,不是使用$1,而是使用\N, N为大于等于0的整数。
如我在IDE中输入:
Abcd
使用正则:
^.*$
我需要把原本内容替换为Abcde,只需要在替换为栏中输入\0e即可
9. 正则表达式性能
这个课题比较难准备,一来是我也只知道点皮毛,二来项目需求不大,三来准备需要时间较长,所以留给大家自己需要的时候去了解吧。 影响正则表达式性能的一个关键字是:“回溯”, 大家可以从这上面开始。
标签:
原文地址:http://www.cnblogs.com/jayruan/p/5428184.html