软件开发架构师

正则表达式基础知识

架构 180 2019-06-12 15:11

这篇呢,主要就是关于正则表达式的一些介绍和常见应用软件及编程语言对正则表达式的支持等内容。。。

 

1、正则表达式(regular expression,):简称regex,可以理解为一种工具。

2、正则表达式的两种基本用途:搜索(匹配)和替换(匹配并替换)。

比如:把URL地址字符串替换为可点击的URL地址场景:

http://www.baidu.com/

使用正则表达式替换为可点击URL地址的场景,替换结果为:

<A HREF="http://www.baidu.com">http://www.baidu.com/</A>

3、定义:正则表达式是一些用来匹配和处理文本的字符串,使用正则表达式语言创建,是内嵌于其他语言或软件产品中的“迷你”语言,

几乎所有的语言或工具都支持它。

下面列举一些合法的正则表达式

Ben
.
www\.forfa\.com
[a-zA-ZQ-9_.]*
<[Hh]1>.*</[Hh]1>
\r\n\r\n
\d{3,3}-\d{3,3}-\d{4,4}

4、一般来说,应用程序大多使用菜单选项和对话框来访问正则表达式,程序设计语言大多在函数或对象类中使用正则表达式。

5、常见应用软件和编程语言对正则表达式的支持汇总如下:

A.1 grep

grep是一种用来对文件或标准输入文本进行文字搜索的Unix工具,支持基本、扩展和Perl正则表达式。

-E:使用扩展正则表达式

-G:使用基本正则表达式

-P:使用Perl正则表达式

注意事项:

①默认情况下,grep将把包含着匹配的各个文本全部显示,如果只想查看匹配结果,请使用-o选项;

②使用-v选项将对整个操作匹配操作进行求非————只显示不匹配的文本行;

③使用-c选项只显示匹配的总数而不是此次匹配的细节;

④grep工具只能进行搜索操作,不能进行替换操作;

 

A.2 javascript

javascript 1.x版本在string和RegExp对象的以下几个方法里实现了正则表达式处理。

exec:一个用来搜索一个匹配的RegExp方法

match:一个用来匹配一个字符串的string方法

replace:一个用来完成替换操作的string方法

search:一个用来测试在某给定字符串里是否存在着一个匹配的string方法

split:一个用来把一个字符串拆分为多个子串的string方法

test:一个用来测试在某给定字符串里是否存在着一个匹配的RegExp方法

△JavaScript度对正则表达式的支持源自Perl语言。

注意事项:

①JavaScript使用命令行选项来管理全局的区分大小写搜索,g选项激活全局搜索功能,i选项让匹配操作不区分字母大小写,这两个选项可组合为gi;

②其他命令行选项包括:m,支持多行字符串;s,支持单行字符串;x,忽略正则表达式模式里的空白字符;

③在使用回溯引用时,$'将返回被匹配字符串前面的所有东西,$`将返回被匹配字符串后面的所有东西;$+将返回最后一个被匹配的子表达式,$&将返回被匹配到的所有东西;

④JavaScript提供一个名为RegExp的全局对象,在执行完一个正则表达式后,可以通过这个对象获得与这次执行有关的信息;

⑤JavaScript不支持POSIX字符类;

⑥JavaScript不支持\A和\Z。

 

A.3 Microsoft ASP

所有ASP脚本语言都支持正则表达式,通过一个名为RegExp的对象提供,其包含以下几个方法:

Excute:执行一个正则表达式的搜索操作

Replace:执行一个”搜索和替换”操作

Test:检查一个字符串是否与一个给定的字符串匹配

ASP正则表达式还有一些局限性,下面是注意事项:

①执行操作之前必须先创建并填充一个Regexp对象的实例;

②正则表达式被存放在Regexp.Pattern里;

③支持全局限定符和大小写限定符;前者是一个存放在Regexp.Global里的布尔值,后者是一个存放在RegExp.IgnoreCase里的布尔值;

④Excute()方法将返回一个Match对象,通过这个对象可以访问到所有的匹配;

⑤不支持向前查找(?=和?!)和向后查找(?>=和?<!)。

 

A.4 Macromedia ColdFusion

Macromedia ColdFusion通过以下四个函数提供正则表达式支持:

REFid:执行搜索

REFindNoCase():执行不区分字母大小写的搜索

REReplace:执行替换

REReplaceNoCase():执行不区分字母大小写的替换

ColdFusion支持与Perl语言兼容的正则表达式,以下是注意事项:

①.总是匹配换行符;

②使用回溯引用时,必须使用\n代替$n来引用回溯引用变量。ColdFusion将自动把替换字符串里的所有$n字符解释为它们的转义含义;

③不必对替换字符串里的反斜线字符进行转义,ColdFusion将自动把他们解释为它们的转义含义。但大小写转换序列或它们的转义版本(例如\u或\\u)属于例外;

④嵌入限定符((?i))总是影响整个表达式,即使它们只出现在某个子表达式内部;

⑤ColdFusion不支持在替换字符串里使用\Q、\u\L或\l\U;

⑥ColdFusion不支持向后查找(?<=和?<!);

⑦ColdFusion不支持条件处理;

⑧ColdFusion不支持\x、\N、\p和\C;

 

A.5 Microsoft.NET

PS:Microsoft ASP.NET、Microsoft Visual Studio.NET和Microsoft C#里面的正则表达式都由.NET Framework提供。

NET Framework通过它的基本类库提供了强大和灵活的正则表达式支持,这些支持在所有的.NET语言和工具里都可以使用。

.NET里正则表达式支持是通过Regex类(以及其他一些辅助类)提供的;Regex类有以下一些方法:

①IsMatch():测试在某个给定的字符里是否可以找到一个匹配;

②Match():搜索一个单个的匹配,该匹配将被作为一个Match对象;

③Matcher():搜索所有的匹配,它们将被返回一个Match-collection对象;

④Replace():在一个给定的字符串上进行替换操作;

⑤Split():把一个字符串拆分为一个字符串数组;

利用各种包装器函数,在无须创建和使用一个Regex类的情况下也可以执行一个正则表达式,例如:

①Regex.IsMatch():功能上等价于IsMatch()方法;

②Regex.Match():功能上等价于Match()方法;

③Regex.Matches():功能上等价于Matches()方法;

④Regex.Replace():功能上等价于Replace()方法;

⑤Regex.Split():功能上等价于Sqlit()方法;

下面是一些与.NET正则表达式支持有关的注意事项:

①要想使用正则表达式,必须用Imports System.Text.Regu-lar-Expressions语句导入正则表达式对象;

②如果只需要临时使用正则表达式,上述的包装器函数是理想的选择;

③正则表达式选项需要使用Regex.Options属性给出,它是一个RegexOptions枚举集合,可以对这个集合的各有关成员如IgnoreCase、Multiline、Singleline等进行设置;

④.NET支持命名捕获,即对子表达式进行命名。命名一个子表达式语句是?<name>,引用这个回溯引用的语法是\k<name>,在一个替换模式里引用它的语法是$<name>;

⑤使用回溯引用时,$`(反引号)将返回被匹配字符串前面的所有东西,$'(单引号)将返回被匹配字符串后面的所有东西,$+将返回最后一个被匹配的子表达式,$_将返回整个

  原始字符串,$&将返回整个被匹配的字符串;

⑥.NET Framework不支持使用\E、\l、\L和\U进行大小写转换;

⑦.NET Framework不支持POSIX字符类;

 

A.6 MySQL

MySQL对正则表达式的支持体现在允许在where字句里使用如下格式的表达式:

REGEXP "erpression"

下面是一条使用了正则表达式的MySQL语句的完整语法:

select * from table where REGEXP 'pattern';

MySQL正则表达式支持很有用,功能也很强大,但它还算不上是一个完备的正则表达式表现;以下是它的不足之处:

①只提供搜索支持,不支持使用正则表达式进行替换操作;

②默认情况下,正则表达式搜索不区分字母的大小写;如果需要区分大小写,必须再增加一个BINARY关键字(放在REGEXP和模式之间);

③用[[:<:]]来匹配一个单词的开头,用[[:>:]]来匹配一个单词的结束;

④不支持向前预测;

⑤不支持嵌入条件;

⑥不支持八进制字符搜素;

⑦不支持\a、\b、\e、\f和\v;

⑧不支持回溯引用;

 

A.7 Perl

Perl可以说是各种正则表达式的“祖宗”,各种实现几乎斗鱼Perl兼容,正则表达式是Perl的核心组件之一,如果需要在Perl脚本里使用正则表达式,只需如下

给出一个操作和相应模式即可:

①m/pattern:匹配给定的模式;

②s/pattern/pattern:执行一个替换操作;

③qr/pattern:返回一个Regex对象供今后使用;

④sqlit():把一个字符串拆分为子字符串;

注意事项:

①允许把限定字符放在模式的后面。\i用来表明搜索时不区分字母大小写,\g用来表明进行全局搜索;

②使用“回溯引用”时,$'将返回被匹配字符串前面所有的东西,$`将返回被匹配字符串后面所有的东西,$+将返回最后一个被匹配的子表达式,$&将返回整个被匹配字符串;

 

A.8 Sun Java

Java对正则表达式的支持是从1.4版本开始的,此前的JRE(Java Runtime Environment,Java运行环境)不支持正则表达式。

Java语言中的正则表达式匹配功能主要通过java.util.regex.Matcher类和以下方法实现:

find():在一个字符串里寻找一个给定模式的匹配;

lookingAt():用一个给定的模式去尝试匹配一个字符串的开头;

matches():用一个给定的模式去尝试匹配一个完整的字符串;

replaceALL():进行替换操作,对所有的匹配都进行替换;

replaceFirst():进行替换操作,只对第一个匹配进行替换;

Matcher类还提供了几个能让程序员对特定操作做出更细致调控的方法;此外,java.util.regex.pattern类也提供了几个简单易用的包装器方法:

compile():把一个正则表达式编译成一个模式;

flags():返回某给定模式的匹配标志;

matches():在功能上等价于刚才介绍的matches()方法;

pattern():把一个模式还原为一个正则表达式;

sqlit():把一个字符串拆分为子字符串;

Sun发布的Java正则表达式支持与Perl语言基本兼容,但请注意一下几项注意事项:

①要想使用正则表达式,必须先用import java.util.regex.*语句导入正则表达式组件;

②不支持嵌入条件;

③不支持使用\E、\L、\l、\U和\u进行字母大小写转换;

④不支持使用[\b]匹配退格符;

⑤不支持\z;

 

文章评论