正则表达式介绍及一般运用

2009年5月14日星期四

正则表达式介绍及一般运用

正则表达式(regular expression)在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。“正则表达式”通常缩写成“regex”。


 


 一. 基本概念


一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。例如:cut、catcit 这三个字符串,都可以由 "c(u|a|i)t" 这个模式来描述。大部分正则表达式的形式都有如下的结构:


替换 "|"   : 竖直分隔符代表替换。例如"gray|grey"可以匹配grey或gray。
数量限定   :  某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括   “+”,“?”和“*

匹配          :  圆括号可以用来定义操作符的范围和优先度。例如,"gr(a|e)y"等价于"gray|grey","(grand)?father"匹配fathergrandfather


 


二. 基本语法


1.普通字符


字母、数字、汉字、下划线,以及没有被定义特殊意义的标点符号,都是 "普通字符"。"普通字符" 在匹配时,匹配与之相同的一个字符。


如果一个表达式中,所有的字符都是 "普通字符",那么这个表达式的匹配操作,实际上就是一个普通的 "字符串查找" 操作。


 


2. 简单的转义字符


一些不便书写的字符,比如换行符,制表符等,使用 "n,"t 来表示。另外有一些标点符号在正则表达式中,被定义了特殊的意义,因此需要在前面加 """ 进行转义后,匹配该字符本身。
















































转义符



说明



"a



响铃符 = "x07



"f



换页符 = "x0C



"n



换行符 = "x0A



"r



回车符 = "x0D



"t



制表符 = "x09



"v



垂直制表符 = "x0B



"e



ESC 符 = "x1B



"x20



使用两位十六进制表示形式,可与该编号的字符匹配



"u002B



使用四位十六进制表示形式,可与该编号的字符匹配



"x{20A060}



使用任意位十六进制表示形式,可与该编号的字符匹配




       被定义了特殊的意义,因而需要在前面添加 """ 来匹配该字符本身的标点符号:
















































字符



说明



^



匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 ""^"



$



匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 ""$"



( )



标记一个子表达式的开始和结束位置。要匹配小括号,请使用 ""(" 和 "")"



[ ]



用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 ""[" 和 ""]"



{ }



修饰匹配次数的符号。要匹配大括号,请使用 ""{" 和 ""}"



.



匹配除了换行符("n)以外的任意一个字符。要匹配小数点本身,请使用 ""."



?



修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 ""?"



+



修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 ""+"



*



修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 ""*"



|



左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 ""|"







3.转义字符 "Q..."E


使用 "Q 开始,"E 结束,可使中间的标点符号失去特殊意义,将中间的字符作为普通字符。


使用 "U 开始,"E 结束,除了具有 "Q..."E 相同的功能外,还将中间的小写字母转换成大写。在大小写敏感模式下,只能与大写文本匹配。


使用 "L 开始,"E 结束,除了具有 "Q..."E 相同的功能外,还将中间的大写字母转换成小写。在大小写敏感模式下,只能与小写文本匹配。


"Q..."E 适合用于:表达式中需要比较长的普通文本,而其中包含了特殊符号。


举例 :
















表达式



说明



"Q(a+b)*3"E



可匹配文本 "(a+b)*3"。



"(a"+b")"*3



如果不使用 "Q..."E 进行转义,则对每个特殊符号进行转义。




 


4.字符集合


可以匹配 "多个字符" 其中任意一个字符的正则表达式。虽然是 "多个字符",但每次只能匹配其中一个。



 











































字符集合



说明



.



小数点可以匹配除了换行符("n)以外的任意一个字符



"w



可以匹配任何一个字母或者数字或者下划线



"W



W大写,可以匹配任何一个字母或者数字或者下划线以外的字符



"s



可以匹配空格、制表符、换页符等空白字符的其中任意一个



"S



S大写,可以匹配任何一个空白字符以外的字符



"d



可以匹配任何一个 0~9 数字字符



"D



D大写,可以匹配任何一个非数字字符



[:alpha:]



POSIX 格式,可以匹配任何一个字母



[:^alpha:]



POSIX 否定格式,可以匹配任何一个字母以外的字符



 


5.自定义字符集合 [ ]


用中括号 [ ] 包含多个字符,可以匹配所包含的字符中的任意一个。同样,每次只能匹配其中一个。


用中括号 [^ ] 包含多个字符,构成否定格式,可以匹配所包含的字符之外的任意一个字符。



 


正则表达式中的特殊符号,如果被包含于中括号中,则失去特殊意义,但 " [ ] : ^ - 除外。


标准字符集合,除小数点(.)外,如果被包含于中括号中,自定义字符集合将包含该集合。

比如:["d."-+],将可以匹配数字,小数点和 + - 符号。(小数点和 + 号失去特殊意义)


用减号相连的 2 个普通字符,自定义字符集合将包含该范围。


比如:["dA-Fa-f],将可以匹配 0 - 9, A - F, a - f。


 


6. 匹配次数限定符


使被修饰的表达式可多次重复匹配的修饰符。



可使被修饰的表达式重复固定次数,也可以限定一定的重复匹配的次数范围。


在限定符之后的表达式能够匹配成功的情况下,不定次数的限定符总是尽可能的多匹配。如果之后的表达式匹配失败,限定符可适当“让出”能够匹配的字符,以使整个表达式匹配成功。这种模式就叫“贪婪模式”。
































限定符



说明



{n}



表达式固定重复n次,比如:""w{2}" 相当于 ""w"w"



{m, n}



表达式尽可能重复n次,至少重复m次:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"



{m, }



表达式尽可能的多匹配,至少重复m次:""w"d{2,}"可以匹配 "a12","x456"...



?



表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}



+



表达式尽可能的多匹配,至少匹配1次,相当于 {1, }



*



表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }




 


7.字符边界


本身不匹配任何字符,只对字符边界和字符间缝隙附加条件的表达式。


有些正则表达式中的符号,可以对文本中当前所在位置作限制条件:




















边界条件



说明



^



当前位置必须是文本开始位置



$



当前位置必须是文本结束位置



"b



当前位置的左右两侧,只能有一侧是字母数字或下划线




如果正则表达式的匹配模式为 MULTILINE 模式,^ 可匹配一行文本的行首,$ 可匹配一行文本的行末。


当 "b 被包含于字符集合中时,"b 代表退格符(ASCII码 = 8)。


 


8.选择表达式 xxx | xxx


使用竖线 "|" 分隔多段表达式,整个表达式可匹配其中任意一段。


 


9. 分组 ( )


用括号 ( ) 将其他表达式包含,可以使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。另外,用括号包含的表达式,所匹配到的内容将单独作记录,匹配过程中或结束后可以被获取。


 


 


三.在 Microsoft Visual Basic 6.0 中使用正则表达式



在visual basic 6, 使用正则表达式在reference里面添加Microsoft VBScript Regular Expressions 5.5 库。Visual Basic 6.0 中,RegExp 对象使用正则表达式匹配模式。下面是 RegExp 提供的属性,这些属性用于设置那些用来比较传递给 RegExp 实例的字符串的模式。



  • Pattern:一个字符串,用来定义正则表达式。

  • IgnoreCase:一个布尔值属性,指示是否必须对一个字符串中的所有可能的匹配进行正则表达式测试。

  • Global:设置一个布尔值或返回一个布尔值,该布尔值指示一个模式是必须匹配整个搜索字符串中的所有搜索项还是只匹配第一个搜索项。

  • RegExp:提供以下方法以确定字符串是否与正则表达式的特定模式相匹配:

    • Test:返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。

    • Execute:返回一个 MatchCollection 对象,该对象包含每个成功匹配的 Match 对象。




要将一个字符串与一个正则表达式匹配,请按照以下步骤操作:

  1. 使用“RegExp”对象的“Pattern”方法设置正则表达式。

  2. 获取该字符串以使用该模式进行检验。

  3. 将“RegExp”对象的“IgnoreCase”属性设置为 True。

  4. 将您在第 2 步中获取的字符串作为一个参数传递给“RegExp”对象的“Execute”方法。

  5. 将“Execute”方法的返回值指定给“MatchCollection”对象。


下面是一个使用RegExp的函数,该函数用于验证目标字符串是否与验证pattern吻合.

Private Function verifyFile(subjectString As String, Pattern As StringAs Boolean



Dim myRegExp As RegExp

Set myRegExp = New RegExp



myRegExp.IgnoreCase 
= True

myRegExp.Global 
= True

myRegExp.Pattern 
= Pattern



verifyFile 
= myRegExp.Test(subjectString)



End Function







四. 正则表达式在VB.NET中的应用


 VB.NET中使用正则表达式必须先引入命名空间System.Text.RegularExpressions,该命名空间包含一下七个类:RegexMatchMatchCollectionGroupCollectionCaptureCollectionGroupCapture


Regex类表示不可变(只读)正则表达式类,设置待匹配字符串的模式。Match 类表示正则表达式匹配操作的结果。MatchCollection 类表示成功的非重叠匹配的序列,即匹配后得到的字符串集合。在正则表达式中应用最多的就是这三个类。


使用正则表达式类的通用方法是:


    首先生成一个Regex类的实例,并在传入参数中输入正则表达式的模式,然后使用Regex类的相应方法,如IsMatch(判断是否匹配)、Match(返回匹配得到的字符串)等等

当然也可以使用Regex类的共享方法而不实例化Regex类——IsMatchMatch等等(即上述方法的共享版本)获得所需要的结果。这种方法适于匹配模式不固定,匹配次数不多的情况。




接下来给出一个VB.NET中正则表达式的应用。






Imports System.Text.RegularExpressions

Public Module Test

   
Public Sub Main()

      
' Define a regular expression for currency values.

      Dim rx As New Regex("^-?"d+("."d{2})?$")

      ' Define some test strings.

      Dim tests() As String = {"-42""19.99""0.001""100 USD", _

                               
".34""0.34""1,052.21"}

      
' Check each test string against the regular expression.

      For Each test As String In tests

         
If rx.IsMatch(test) Then

            Console.WriteLine(
"{0} is a currency value.", test)

         
Else

            Console.WriteLine(
"{0} is not a currency value.", test)

         
End If

      
Next

   
End Sub


End Module


' The example displays the following output to the console:

'
      -42 is a currency value.

'
      19.99 is a currency value.

'
      0.001 is not a currency value.

'
      100 USD is not a currency value.

'
      .34 is not a currency value.

'
      0.34 is a currency value.

'
      1,052.21 is not a currency value.




(这篇文章是收集了网上的一些资料整理而成的,非原创...) 




 





 





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


佛对我说:你心里有尘。我用力的拭擦。


佛说:你错了,尘是擦不掉的。于是我将心剥了下来。


佛又对我说:你又错了,尘本非尘,何来有尘。


0 评论:

发表评论