Regex 工具 |
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 |
更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序与语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
如何在 Xojo (REALbasic) 中使用正则表达式
Xojo,以前称为 REALbasic,包含内置的 RegEx 类别。在内部,这个类别是基于开源的 PCRE 函数库。对你这个 Xojo 开发人员来说,这表示 RegEx 类别会提供给你丰富的 Perl 兼容正则表达式。本网站上的 正则表达式教程 没有明确提到 Xojo。教学中所述关于 PCRE 的 regex 风格,也适用于 Xojo。唯一的例外是 不区分大小写 和「多行」比对模式。在 PCRE 中,它们缺省为关闭,而在 Xojo 中,它们缺省为打开。
Xojo 使用 PCRE 的 UTF-8 版本。这表示,如果您要处理从文件或网络截取的非 ASCII 数据,您需要使用 Xojo 的 TextConverter 类别将字符串转换成 UTF-8,然后再传递给 RegEx 对象。您也需要使用 TextConverter 将 RegEx 类别传回的字符串从 UTF-8 转换回您的应用程序使用的编码。
RegEx 类别
若要使用正则表达式,您需要创建 RegEx 类别的新运行个体。将您的正则表达式指定给 SearchPattern 属性。您可以在 Options 属性中设置各种选项,这是 RegExOptions 类别的运行个体。
若要检查正则表达式是否符合特定字符串,请调用 RegEx 对象的 Search 方法,并将主旨字符串传递为参数。如果找到符合项,此方法会传回 RegExMatch 类别的运行个体,如果找不到符合项,则传回 Nil。若要在同一个主旨字符串中找到第二个符合项,请再次调用 Search 方法,而不要传递任何参数。不要再次传递主旨字符串,因为这样会从字符串的开头重新开始搜索。持续调用 Search,而不要传递任何参数,直到它传回 Nil,以反复运算字符串中所有正则表达式符合项。
RegExMatch 类别
当 Regex.Search 方法找到一个符合项时,它会将符合项的详细数据保存在 RegExMatch 对象中。此对象有三个属性。SubExpressionCount 属性会传回正则表达式中 捕获组 的数量加上一。例如,它会传回正则表达式 (1)(2)
的 3。SubExpressionString 属性会传回由正则表达式或捕获组符合的子字符串。SubExpressionString(0) 会传回整个正则表达式符合项,而 SubExpressionString(1) 到 SubExpressionString(SubExpressionCount-1) 会传回捕获组的符合项。SubExpressionStartB 会传回整个正则表达式或其中一个捕获组符合项开始的字节偏移量,具体取决于您传递给属性的数字索引作为参数。
RegExOptions 类别
RegExOptions 类别有九个属性,可为您的正则表达式设置各种选项。
- 将 CaseSensitive (缺省为 False) 设置为 True,以将大写和小写字母视为不同的字符。此选项是其他编程语言中「大小写不敏感模式」或 /i 的相反。
- 将 DotMatchAll (缺省为 False) 设置为 True,以让 点 符合所有字符,包括换行字符。此选项等同于其他编程语言中的「单行模式」或 /s。
- 如果您希望量词是惰性的,请将 Greedy (缺省为 True) 设置为 False,实际上使
.*
与.*?
相同。我强烈建议不要将 Greedy 设置为 False。相反,请改用.*?
语法。这样,当有人只查看正则表达式时,他们会清楚地看到您何时使用贪婪量词,以及何时使用惰性量词。 - LineEndType 选项是唯一一个采用整数而非布尔值的选项。此选项会影响 插入符号和美元 视为「行尾」字符的字符。默认值为 0,它接受 \r 和 \n 作为行尾字符。将其设置为 1 以自动侦测主机平台,并在您的应用程序运行于 Windows 和 Linux 时使用 \n,在 Mac 上运行时使用 \r。将其设置为 2 表示 Mac (\r)、3 表示 Windows (\n) 和 4 表示 UNIX (\n)。我建议您将此选项保留为零,这最有可能提供您预期的结果。此选项实际上是 Xojo 中对 PCRE 函数库的修改。PCRE 仅支持选项 4,这常常让 Windows 开发人员感到困惑,因为它会导致
test$
与test\r\n
不符合,因为 Windows 使用 \r\n 作为换行符号。 - 如果您希望略过长度为零的符合项,请将 MatchEmpty (缺省为 True) 设置为 False。
- 如果您希望 Regex.Replace 方法在主旨字符串中搜索并取代所有正则表达式比对,而非仅取代第一个比对,请将 ReplaceAllMatches 设为 True(缺省为 False)。
- 如果您不希望将字符串开头视为行开头,请将 StringBeginIsLineBegin(缺省为 True)设为 False。如果您正在处理一大块数据作为数个独立字符串,而只有第一个字符串应视为开始(概念上的)整体字符串,这会很有用。
- 类似地,如果您传递至 Search 方法的字符串并非您正在处理的整体数据块的真正结尾,请将 StringEndIsLineEnd(缺省为 True)设为 False。
- 将 TreatTargetAsOneLine(缺省为 False)设为 True,可让插入符号和美元符号仅在字符串的开头和结尾比对。缺省情况下,它们也会在嵌入式换行符号之后和之前比对。此选项是其他编程语言中「多行模式」或 /m 的反向。
Xojo RegEx 原代码范例
'Prepare a regular expression object
Dim myRegEx As RegEx
Dim myMatch As RegExMatch
myRegEx = New RegEx
myRegEx.Options.TreatTargetAsOneLine = True
myRegEx.SearchPattern = "regex"
'Pop up all matches one by one
myMatch = myRegEx.Search(SubjectString)
While myMatch <> Nil
MsgBox(myMatch.SubExpressionString(0))
myMatch = myRegEx.Search()
Wend
搜索和取代
除了在字符串中寻找正则表达式比对之外,您还可以将比对取代为另一个字符串。为此,请设置 RegEx 对象的 ReplacementPattern 属性,然后调用 Replace 方法。将来源字符串作为参数传递至 Replace 方法。此方法会传回已套用取代的字符串副本。RegEx.Options.ReplaceAllMatches 属性会判断是否仅取代第一个正则表达式比对,或是否取代所有正则表达式比对。
在 ReplacementPattern 字符串中,您可以使用 $&
、$0
或 \0
将整个正则表达式比对插入取代中。对于第一个捕获组的比对,请使用 $1
或 \1
;对于第二个比对,请使用 $2
或 \2
,以此类推。
如果您希望更进一步控制取代方式,您可以像上述代码片段中一样,反复运行正则表达式比对,并针对每个比对调用 RegExMatch.Replace 方法。此方法有点名不符实,因为它实际上并未取代任何内容。相反地,它会传回 RegEx.ReplacementPattern 字符串,其中所有对比对和捕获组的参照都已取代。您可以使用这些结果自行进行取代。如果您希望收集每个正则表达式比对的捕获组组合,此方法也很有用。