组内正则培训记录

前端之家收集整理的这篇文章主要介绍了组内正则培训记录前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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 Studiosql Server)

如上文所述, 微软的IDE中暂不支持预匹配功能

在Visual 2010或以下,和sql SERVER中要使用正则表达式进行查找或替换,只需要勾选窗口中底部的“使用”复选框并选择"正则表达式"即可.

在Visual 2012或以上,要要使用正则,只需要开启查找、替换功能中的“*.”的选项即可。

  

在微软的IDE中(VS和sql SERVER),在替换功能中,要使用匹配并捕获到的字符串,不是使用$1,而是使用\N, N为大于等于0的整数。

 

如我在IDE中输入:

Abcd

                   使用正则:

                            ^.*$

                   我需要把原本内容替换为Abcde,只需要在替换为栏中输入\0e即可

  

9. 正则表达式性能

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

 

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

 

谢谢观看。

 

 

猜你在找的正则表达式相关文章