正则表达式工具 |
grep |
语言和函数库 |
Boost |
Delphi |
GNU (Linux) |
Groovy |
Java |
JavaScript |
.NET |
PCRE (C/C++) |
PCRE2 (C/C++) |
Perl |
PHP |
POSIX |
PowerShell |
Python |
R |
Ruby |
std::regex |
Tcl |
VBScript |
Visual Basic 6 |
wxWidgets |
XML Schema |
Xojo |
XQuery 和 XPath |
XRegExp |
数据库 |
MySQL |
Oracle |
PostgreSQL |
本网站的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
VBScript 的正则表达式支持
VBScript 内置支持正则表达式。如果您使用 VBScript 在用户端验证网页上的用户输入,使用 VBScript 的正则表达式支持将大幅减少您需要编写的代码量。
Microsoft 在 Internet Explorer 版本 5.5 中对 VBScript 的正则表达式支持进行了一些重大强化。版本 5.5 实作了相当多在先前版本 VBScript 中遗漏的必要正则表达式功能。每当本网站提到 VBScript 时,这些陈述都指的是 VBScript 版本 5.5 的正则表达式支持。
基本上,Internet Explorer 5.5 实作 JavaScript 正则表达式风格。但 IE 5.5 在网页标准方面的得分并不高。在它实作的 JavaScript 正则表达式和实际标准之间有相当多的差异。很幸运地,大部分都是不太可能影响您的边缘案例。因此,本网站上关于 JavaScript 正则表达式风格所述的一切也适用于 VBScript。现代版本的 IE 在奇异模式中呈现网页时仍然使用 IE 5.5 实作。在标准模式中,现代版本的 IE 非常严格地遵循 JavaScript 标准。即使已安装现代版本的 IE,VBScript 正则表达式仍然使用 IE 5.5 实作。
JavaScript 和 VBScript 实作 Perl 风格的正则表达式。然而,它们缺少许多 Perl 和其他现代正则表达式风格中可用的高端功能
- 没有 \A 或 \Z锚定 来比对字符串的开头或结尾。改用 插入符号或美元符号。
- 后向观察 完全不支持。 前向观察 完全支持。
- 没有 原子组 或 独占量词
- 没有 Unicode 支持,除了使用
\uFFFF
比对单一字符 - 没有 命名捕获组。改用 编号捕获组。
- 没有 模式修改词 来设置正则表达式中的比对选项。
- 没有 条件式。
- 没有 正则表达式注解。改用 VBScript 单引号注解来描述正则表达式,放在正则表达式字符串之外。
RegExp 对象的 1.0 版甚至缺少 惰性量词 等基本功能。这是本网站不讨论 VBScript RegExp 1.0 的主要原因。所有早于 5.5 版的 Internet Explorer 都包含 1.0 版的 RegExp 对象。除了 1.0 和 5.5 版之外,没有其他版本。
如何使用 VBScript RegExp 对象
你可以通过创建一个或多个 RegExp
对象的运行个体来在 VBScript 中使用正则表达式。这个对象让你可以在字符串中寻找正则表达式比对,并用其他字符串取代字符串中的正则表达式比对。VBScript 的 RegExp 对象提供的功能相当阳春。然而,对于 VBScript 中通常运行的简单输入验证和输出格式化任务来说,已经绰绰有余。
RegExp 对象阳春特性的优点是它非常容易使用。创建一个,放入正则表达式,然后让它比对或取代。只有四个属性和三个方法可用。
创建对象后,将你想要搜索的正则表达式指定给 Pattern
属性。如果你想要使用文本正则表达式,而不是用户提供的正则表达式,只要将正则表达式放在双引号字符串中即可。缺省情况下,正则表达式会区分大小写。将 IgnoreCase
属性设置为 True 以不区分大小写。 插入符号和美元符号 缺省只会比对主旨字符串的最开头和最结尾。如果你的主旨字符串包含多行,由换行符号分隔,你可以通过将 Multiline
属性设置为 True,让插入符号和美元符号 比对这些行的开头和结尾。VBScript 没有 让点符号比对换行符号字符 的选项。最后,如果你想要 RegExp 对象传回或取代所有比对,而不是只传回或取代第一个比对,请将 Global
属性设置为 True。
'Prepare a regular expression object
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "regex"
设置 RegExp 对象的属性后,你可以调用三个方法中的其中一个来运行三个基本任务之一。 Test
方法接收一个参数:要对其测试正则表达式的字符串。 Test
传回 True 或 False,表示正则表达式是否比对(字符串的一部分)。在验证用户输入时,你通常会想要检查整个字符串是否比对正则表达式。为此,请在正则表达式的开头放置 插入符号,在结尾放置 美元符号,将正则表达式锚定在主旨字符串的开头和结尾。
运行方法也采用一个字符串参数。它不会传回 True 或 False,而是传回一个 MatchCollection
对象。如果正则表达式完全无法与主旨字符串相符,MatchCollection.Count
会为零。如果 RegExp.Global
属性为 False(缺省),MatchCollection
将只包含第一个相符项目。如果 RegExp.Global
为 true,Matches>
将包含所有相符项目。
取代方法采用两个字符串参数。第一个参数为主旨字符串,而第二个参数为取代文本。如果 RegExp.Global
属性为 False(缺省),取代
将传回主旨字符串,其中第一个正则表达式相符项目(如果有的话)已用取代文本取代。如果 RegExp.Global
为 true,取代
将传回主旨字符串,其中所有正则表达式相符项目都已取代。
您可以指定一个空白字符串作为取代文本。这将导致 取代
方法传回主旨字符串,其中已删除所有正则表达式相符项目。若要将正则表达式相符项目重新插入为取代项目的一部分,请在取代文本中包含 $&
。例如,若要在字符串中用方括号括住每个正则表达式相符项目,请指定 [$&]
作为取代文本。如果正则表达式包含 截取括号,您可以在取代文本中使用 反向引用。取代文本中的 $1
会插入与第一个捕获组相符的文本,$2
会插入第二个相符群组,依此类推,直到 $9
。若要在取代项目中包含一个实际的美元符号,请在传递给 取代
方法的字符串中放置两个连续的美元符号。
取得个别相符项目的信息
RegExp.Execute
方法传回的 MatchCollection
对象是 Match
对象的集合。它只有两个唯读属性。Count
属性指出集合包含多少个相符项目。Item
属性采用一个索引参数(范围从零到 Count-1
),并传回一个 Match
对象。Item
属性是缺省成员,因此您可以将 MatchCollection(7)
写成 MatchCollection.Item(7)
的简写。
处理集合中所有相符项目的最简单方法是使用 For Each 建构,例如
' Pop up a message box for each match
Set myMatches = myRegExp.Execute(subjectString)
For Each myMatch in myMatches
msgbox myMatch.Value, 0, "Found Match"
Next
Match
对象有四个唯读属性。FirstIndex
属性指出相符项目左方字符串中的字符数。如果相符项目是在字符串的最开头找到,FirstIndex
会为零。如果相符项目从字符串中的第二个字符开始,FirstIndex
会为一,依此类推。请注意,这与 VBScript Mid
函数不同,后者会在您将 start
参数设置为一的情况下截取字符串的第一个字符。Match
对象的 Length
属性指出相符项目中的字符数。Value
属性传回相符的文本。
**SubMatches
** 属性为 Match
对象的字符串集合。只有当您的正则表达式有 **捕获组** 时,它才会保留值。该集合会为每个捕获组保留一个字符串。**Count
** 属性会指出集合中的字符串数目。**Item
** 属性会取得一个索引参数,并传回由捕获组比对的文本。**Item
** 属性为缺省成员,因此您可以将 **SubMatches(7)
** 写成 **SubMatches.Item(7)
** 的缩写。很遗憾地,VBScript 没有提供任何方式来截取捕获组的比对位置和长度。
另一个遗憾的是,**SubMatches** 属性**没有**保留完整的正则表达式比对,例如 **SubMatches(0)
**。相反地,**SubMatches(0)** 会保留由第一个捕获组比对的文本,而 **SubMatches(SubMatches.Count-1)** 会保留由最后一个捕获组比对的文本。这与大多数其他编程语言不同。例如在 **VB.NET** 中,**Match.Groups(0)
** 会传回整个正则表达式比对,而 **Match.Groups(1)
** 会传回第一个捕获组的比对。请注意,这也与您可以在传递给 **RegExp.Replace
** 方法的取代文本中使用的反向引用不同。在取代文本中,**$1** 会插入由第一个捕获组比对的文本,就像大多数其他正则表达式风格一样。**$0** 没有被任何东西取代,而是直接插入。
在您的网络浏览器中测试 VBScript 的 RegExp 支持
我创建了一个 **范例网页,显示 VBScript 的正则表达式支持** 的实际应用。如果您使用的是 Internet Explorer,您现在可以在您的网络浏览器中尝试看看。原代码显示在范例下方。