组内正则培训记录

 

0. 注: 不同语言中的正则表达式实现都会有一些不同。下文中的代码示例除特别说明的外,都是使用JS中的正则。

1. 正则表达式关键字

( ) [ ] { } . * ^ $ + ?

  

2. 正则表达式最常用语法

PS: pattern表示一个正则表达式

字符

说明

转义符

^

表示非,或匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“ ”或“ ”之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“ ”或“ ”之前的位置。

{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}。

.(小数点)

匹配除“ ”之外的任何单个字符。若要匹配包括“ ”在内的任意字符,请使用诸如“[sS]”之类的模式。

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]。

换行符匹配。等效于 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)         单行模式,   正则的默认匹配模式,如果输入的文本包含 等换行符时,正则的关键字$会匹配字符串结束为止。

e)         多行模式,   MultiLine模式,开启后,关键字^和$可以匹配每行的开始和结束,每行的开始结束根据换行符( )决定。

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

http://zend.jz123.cn/9.htm

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,只需要在替换为栏中输入e即可

  

9. 正则表达式性能

这个课题比较难准备,一来是我也只知道点皮毛,二来项目需求不大,三来准备需要时间较长,所以留给大家自己需要的时候去了解吧。 影响正则表达式性能的一个关键字是:“回溯”, 大家可以从这上面开始。

原文地址:https://www.cnblogs.com/jayruan/p/5428184.html