广告

小谈正则表达式RegExp_基础应用

英文名为:RegExp,全称为:Regular Expression
它就是一个规则表达式,其初衷是用来检测字符串是否符合预定规则,后来也用作查找/替换预定规则的字符串
比如我们在检查用户提交的表单中邮件字段是否符合邮件的规则就可以用小小正则表达式搞定,省去大堆条件语句.
其实没必要去深入研究这个东东,因为一般常用的一些规则莫非就是邮件,URL,电话号码等等规则,直接拿来主义就行~
案例一:检测网站主页链接的规则
规则说明:此规则用来检测网站主页链接是否符合预定规则.
一般的,像http://www.waisir.com/或www.waisir.com或waisir.com这样的写法我们都认为它是符合规则的.
正则表达式

规则如下:
sPattern = “^((https?)://)?[a-z]+\.{1}[a-z]+\.{1}[a-z]+/?$”
是不是看起来比较吃力,将其分解如下:
sPattern = “^((https?)://)?”
sPattern = sPattern + “[a-z]+”
sPattern = sPattern + “\.{1}”
sPattern = sPattern + “[a-z]+”
sPattern = sPattern + “\.{1}”
sPattern = sPattern + “[a-z]+/?$”
使用以上规则检验如下字符串匹配情况如下:
http://www.waisir.com/ 返回true
http://www.waisir.com// 返回false
http://www.waisir.com 返回true
http://www..waisir.com 返回false
http://waisir.com 返回false (别疑惑,待后文分解)
www.waisir.com 返回true

注解如下
1.若将规则1改为sPattern = “((https?)://)?” (去掉^)
这样修改有问题:如在检验 htttttp://www.waisir.com 时候会返回true且为www.waisir.com
因为^符号若出现在规则开头则标志着规则的开始,如果去掉了^,在检验htttttp://www.waisir.com时就可以不从头开始检索
^符号出现在规则中一般表示”非”这个概念.


2.若将规则1改为sPattern = “^((https?)://)” (去掉?)
这样修改有问题:修改后在检验不含有http://等协议标识的网址会返回false,如www.waisir.com返回false
因为?符号表示前面的规则可有可无,去掉了?则表示前面的一个规则是必须的.
()在正则表达式中的作用是将括号内部相对于括号外部而言视为一个整体.
在()?这个组合中,?符号作用与()整体
在https?中,?符号作用于s字符而非https字符串,还望留意.


3.规则1中sPattern = “^((https?)://)?” 在s后添加?符号是为了满足http://和https://都能识别.
规则1也可以写成:sPattern = “^((https|http)://)?”


4.若将规则2改为sPattern = sPattern + “[a-z]” (去掉+)
这样修改有问题:如在检验www.waisir.com返回false,检验w.waisir.com返回true
因为+符号表示将前一个字符规则重复1次以上,切记别把+号理解为连接字符串符号!
同理的*符号表示将前一个字符规则重复0次以上
?符号表示将前一个字符规则重复0次或者1次
[a-z]表示一个a到z的字符集合,只需满足当前字符属于集合即可.单独的使用它只表示集合中的一个字符
同理的[a-zA-Z0-9]表示字母和数字集合.


5.若将规则3改为sPattern = sPattern + “.{1}” (去掉\)
这样修改有问题:如在检验http://www=waisir.com返回true
因为.圆点符号在正则表达式中是特殊符号,特殊符号都要特殊处理,方法是在特殊符号前面加\符号即可转义为一般符号.
同理? * + \ ^ ( ) [ ] { { } & : – 等符号在使用为字符时都应该在其前面加\符合将其转义.


6.若将规则3改为sPattern = sPattern + “\.” (去掉{1})
这样修改没有问题:在.后面加{1}表示只需要1个点,而这里恰好只需要1个点,所以是没问题的
.圆点 用来表示一个任意的字符(换行符除外)
{n}表示前一个规则一定出现n次
{n,}表示前一个规则至少出现n次
{n,m}表示前一个规则至少出现n次,最多出现m次


7.若将规则6改为sPattern = sPattern + “[a-z]+$” (去掉/?)
这样修改有问题:如在检测http://www.waisir.com/返回false
因为$符号标志着该规则的结束,在此即最后的字符只能是a-z中的之一.
所以我们在后面加上/?来表示链接的最后可以以斜杠/结尾,并且只能有一个.


8.完善规则.我们写正则表达式和写数学表达式一样,由左至右,由简到繁,先框架后完善,规则由宽到严.
我们知道,域名可以有由数字,字母和中横线组成,且一般的,中横线只能在字母或者数字中间出现,且个数不限1个.
因此,我们需要完善规则
只需将规则2和规则4改为:
sPattern = sPattern + “[a-z0-9]+-*[a-z0-9]+”
注:由于先阶段正则表达式规则在不同的语言上还有些许不同,比如在大小写处理上会有不同,这里就不做详解.


9.完善规则.一般的,我们认为像http://waisir.com和waisir.com这样的写法也是符合规则的.因此我们需要做些调整
在规则2和规则3做调整后如下:
sPattern = sPattern + “([a-z]+”
sPattern = sPattern + “\.{1})?”

VB中使用正则表达式
注:需引用Microsoft VBScript Regular Expressions 5.5
模版如下:

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
''Add the Function below
Function TestRegExp(myPattern As String, myString As String)
  ''Create objects.
  Dim objRegExp As RegExp
  Dim objMatch As Match
  Dim colMatches   As MatchCollection
  Dim RetStr As String
 
  '' Create a regular expression object.
  Set objRegExp = New RegExp
 
  ''Set the pattern by using the Pattern property.
  objRegExp.Pattern = myPattern
 
  '' Set Case Insensitivity.
  objRegExp.IgnoreCase = True
 
  ''Set global applicability.
  objRegExp.Global = True
 
  ''Test whether the String can be compared.
  If (objRegExp.Test(myString) = True) Then
 
  ''Get the matches.
   Set colMatches = objRegExp.Execute(myString)   '' Execute search.

   For Each objMatch In colMatches   '' Iterate Matches collection.
     RetStr = RetStr & "Match found at position "
     RetStr = RetStr & objMatch.FirstIndex & ". Match Value is ''"
     RetStr = RetStr & objMatch.Value & "''." & vbCrLf
   Next
  Else
   RetStr = "String Matching Failed"
  End If
  TestRegExp = RetStr
End Function
 
 
''Call funciton
Private Sub Command1_Click()
Dim sPattern$, sUrl$
    ''Create Regular Exoression
    sPattern = "^((https?)://)?"
    sPattern = sPattern + "([a-z]+"
    sPattern = sPattern + "\.)?"
    sPattern = sPattern + "[a-z]+"
    sPattern = sPattern + "\.{1}"
    sPattern = sPattern + "[a-z]+/?$"
 
    ''Add a String to test
    sUrl = "http://www.waisir.com/"
 
    MsgBox (TestRegExp(sPattern, sUrl))
End Sub

4 thoughts on “小谈正则表达式RegExp_基础应用

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>