Visual Foxpro中正则表达式的应用
(暨南大学计算中心)
摘 要:介绍了Visual Foxpro中正则表达式的应用,并给出了一个具体实例。
正则表达式(Regular Expression)作为字符串处理的有效工具,在许多脚本语言中得到了广泛的应用,如VBScript就内置了对正则表达式的支持。利用VBScript所提供的RegExp对象,我们也可以在Visual Foxpro中使用正则表达式,从而提高Visual Foxpro的字符串处理能力。正则表达式对象RegExp包含在VBScript.dll中,安装了5.0及以上版本的IE浏览器默认已经包含了该对象,否则需要预先注册才能使用。
1 正则表达式简介
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。下表给出了一些常用的元字符以及相关说明:
字符
说明
^
匹配输入字符串开始的位置。
$
匹配输入字符串结尾的位置。
*
零次或多次匹配前面的字符或子表达式。例如,zo*匹配“z”和“zoo”。
+
一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。
?
零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。
{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?”。注意:不能将空格插入逗号和数字之间。
.
匹配除换行符之外的任何单个字符。
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”范围内的任何小写字母。
[^a-z]
反向范围字符。匹配不在指定的范围内的任何字符。例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。
/d
数字字符匹配。等效于 [0-9]。
/D
非数字字符匹配。等效于 [^0-9]。
/n
换行符匹配。
/r
匹配一个回车符。
/s
匹配任何空白字符,包括空格、制表符、换页符等。
/S
匹配任何非空白字符。
/w
匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。
/W
任何非字字符匹配。与“[^A-Za-z0-9_]”等效。
2 如何在Visual Foxpro中应用正则表达式
我们先来看一段程序:
Function CheckExp(patrn,strng)
regEx = CreateObject("VBScript.RegExp") &&建立正则表达式对象
regEx.Pattern = patrn &&设置模式
regEx.IgnoreCase = .T. &&设置是否区分字符大小写
regEx.Global = .T. &&设置全局可用性
Return regEx.Test(strng) &&执行搜索
在这段程序中,我们看到可以使用CreateObject("VBScript.RegExp")来得到一个正则表达式对象,接着对这个对象进行正则匹配模式的赋值,也就是告诉正则表达式对象想要匹配一个什么样子的模式,然后使用方法Test来检测待处理的数据和给出的模式是否相匹配。
以下是正则表达式对象常用的方法和属性:
(1) Execute 方法
描述:对指定的字符串执行正则表达式搜索。
语法:object.Execute(string)
Execute方法的语法包括以下部分:
object:必需的。总是一个RegExp对象的名称。
string:必需的。要在其上执行正则表达式的文本字符串。
说明:正则表达式搜索的设计模式是通过RegExp对象的Pattern来设置的。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的Matches集合。
(2) Test方法
描述:对指定的字符串执行一个正则表达式搜索,并返回一个逻辑值指示是否找到匹配的模式。
语法:object.Test(string)
Test方法的语法包括以下部分:
object:必需的。总是一个RegExp对象的名称。
string:必需的。要执行正则表达式搜索的文本字符串。
说明:正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。如果找到了匹配的模式,Test方法返回.T.,否则返回.F.。
(3) Global属性
描述:设置或返回一个逻辑值,该值指明在搜索字符串时模式是全部匹配还是只匹配第一个。
语法:object.Global[=.T.|.F.]
object参数总是RegExp对象。如果搜索应用于整个字符串,Global属性的值为.T.,否则其值为.F.。默认的设置为.T.。
(4) IgnoreCase属性
描述:设置或返回一个逻辑值,指明模式搜索是否区分大小写。
语法:object.IgnoreCase[=.T.|.F.]
object参数总是一个RegExp对象。如果搜索是区分大小写的,则IgnoreCase属性为.F.,否则为.T.。缺省值为.T.。
(5) Pattern属性
描述:设置或返回被搜索的正则表达式模式。
语法:object.Pattern[="searchstring"]
Pattern属性的语法包含以下部分:
object:必需的。总是一个RegExp对象变量。
searchstring:可选的。被搜索的正则字符串表达式。
3 示例
Clear
?RegExpTest("(www.)?([a-zA-Z0-9_-])+(.com.cn|.com|.org)","www.easycon.com.cn www.gnete.com www.gnu.org sina.com.cn")
Function RegExpTest(patrn, strng)
regEx = CreateObject("VBScript.RegExp") &&建立正则表达式对象
regEx.Pattern = patrn &&设置模式
regEx.IgnoreCase = .T. &&设置是否区分字符大小写
regEx.Global = .T. &&设置全局可用性
Matches = regEx.Execute(strng) &&执行搜索
RetStr=""
For Each Match in Matches &&遍历匹配集合
RetStr=RetStr+"Match found at position "+Ltrim(Str(Match.FirstIndex))+","
RetStr=RetStr+"Match Length is "+Ltrim(Str(Match.Length))+","
RetStr=RetStr+"Match Value is "+Match.Value+"."+Chr(10)+Chr(13)
Next
Return RetStr
以上程序把一个字符串中的URL地址打印输出。假设URL地址的要求是:以www开头(也可以没有),以.com.cn、.com、.org结束,中间是字符、数字、下划线或横线的组合。据此可得正则表达式匹配模式为“(www.)?([a-zA-Z0-9_-])+(.com.cn|.com|.org)”。该程序通过使用Execute方法返回一系列Match对象,每一Match对象对应一个匹配结果,且包含有匹配结果的起始索引(FirstIndex)、长度(Length)以及具体的匹配值(Value)。程序运行的结果显示如下:
Match found at position 0,Match Length is 18,Match Value is www.easycon.com.cn.
Match found at position 19,Match Length is 13,Match Value is www.gnete.com.
Match found at position 33,Match Length is 11,Match Value is www.gnu.org.
Match found at position 45,Match Length is 11,Match Value is sina.com.cn.