65.9K
CodeProject 正在变化。 阅读更多。
Home

Expresso - 用于构建和测试正则表达式的工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (278投票s)

2003年2月17日

CPOL

6分钟阅读

viewsIcon

1219321

downloadIcon

30651

用于学习、构建和调试 .NET Framework 正则表达式

引言

.NET Framework 提供了一个强大的 Regex 类用于创建和使用正则表达式。虽然正则表达式是一种强大的文本解析、编辑和替换方法,但其复杂的语法使其难以理解,即使是经验丰富的用户也容易出错。在开发使用正则表达式的代码时,我发现创建和调试表达式的独立工具非常有帮助,可以避免耗时的编译/调试周期。Expresso 能够帮助我完成以下操作:

  • 通过从调色板中选择组件来构建复杂的正则表达式

  • 针对真实或样本输入数据测试表达式

  • 以树状结构显示所有匹配项,展示捕获组以及组内的所有捕获

  • 构建替换字符串并测试匹配和替换功能

  • 在输入数据中高亮显示匹配的文本

  • 自动测试语法错误

  • 生成可直接集成到程序中的 Visual Basic 或 C# 代码

  • 读取或保存正则表达式和输入数据

背景

正则表达式是 Unix、MSDOS、Perl、AWK 等系统用户已经熟悉的“通配符”语法的复杂泛化。例如,在 MSDOS 中,可以使用

dir *.exe

来列出所有具有 exe 扩展名的文件。这里的星号是匹配任何字符字符串的通配符,句点是只匹配句点的字面字符。几十年来,每当需要搜索文本中的复杂模式以提取或编辑部分文本时,都广泛使用了更复杂的系统。 .NET Framework 提供了一个名为 Regex 的类,可用于使用正则表达式执行搜索和替换操作。例如,在 .NET 中,假设我们要查找文本字符串中的所有单词。表达式 \w 将匹配任何字母数字字符(以及下划线)。星号字符可以附加到 \w 以匹配 \w 的任意次数重复,因此 \w* 匹配所有任意长度的仅包含字母数字字符(和下划线)的单词。

Expresso 提供了一个工具箱,用户可以使用一组选项卡页来构建正则表达式,从中可以选择任何语法元素。构建表达式后,可以读取或手动输入样本数据,然后针对该数据运行正则表达式。搜索结果将显示出来,展示 Regex 支持的命名组的层次结构。该工具还允许测试替换字符串,并生成可以直接插入 C# 或 Visual Basic .NET 程序中的代码。

本文的目的不是提供正则表达式使用教程,而是为正则表达式的经验用户和新手提供一个工具。通过尝试 Expresso,可以学习正则表达式的许多复杂行为。

读者也可以尝试探索 Expresso 中的一些代码,以查看正则表达式和 Regex 类的使用示例。

使用 Expresso 在样本输入数据上构建和测试正则表达式

要使用 Expresso,请下载并运行可执行文件,这需要 .NET Framework。如果您想探索代码,请下载并解压缩源文件,然后在 Visual Studio .NET 中打开解决方案,然后编译并运行程序。Expresso 将以预加载到“输入数据”框中的样本数据启动(请参阅上图)。创建您自己的正则表达式,或从列表框中选择一个示例。单击“查找匹配项”来测试正则表达式。匹配项显示在“结果”框中的树状结构中。通过展开加号(如上所示)可以显示多个组和捕获。

要开始尝试您自己的正则表达式,请单击“显示构建器”按钮。它将显示一组选项卡,如下图所示

在此示例中,通过设置指定选项来生成表达式 \P{IsGreek}{4,7}?:匹配长度为四到七个字符的字符串,但尽可能少重复,匹配非希腊字母的任何字符。通过单击“插入”按钮,此表达式将被插入到正在构建的正则表达式文本框中,该文本框将由“查找匹配项”或“替换”按钮使用。使用其他选项卡页,可以测试 .NET 正则表达式的所有语法元素。

Regex 类支持许多选项,例如忽略字符的大小写。这些选项可以使用应用程序主窗体上的复选框进行指定。

可以使用“替换”选项卡上的各种表达式来构建替换字符串。要测试替换模式,请输入正则表达式、替换字符串、一些输入数据,然后单击“替换”按钮。输出将显示在“结果”框中。

使用 Expresso 生成代码

一旦正则表达式经过彻底调试,就可以通过在“代码”菜单中选择相应选项来生成代码。例如,要为查找日期的正则表达式生成代码,请创建以下正则表达式(或从下拉列表中选择此示例)

(?<Month>\d{1,2})/(?<Day>\d{1,2})/(?<Year>(?:\d{4}|\d{2}))

通过从“代码”菜单中选择“生成 C# 代码”,将生成以下代码。它可以保存到文件中,或复制粘贴到 C# 程序中,以创建封装此特定正则表达式的 Regex 对象。请注意,正则表达式本身和所有选定的选项都已内置到新对象的构造函数中。

using System.Text.RegularExpressions;

Regex regex = new Regex(
    @"(?<Month>\d{1,2})/(?<Day>\d{1,2})/(?<Yea"
    + @"r>(?:\d{4}|\d{2}))",
    RegexOptions.IgnoreCase
    | RegexOptions.Multiline
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

关注点

创建此工具后,我发现了 Eric Gunnerson 的 Regex Workbench,它也用于相同的目的。Expresso 在构建表达式方面提供了更多帮助,并且对匹配项的显示更具可读性(在我看来),但 Eric 的工具有一个很好的功能,即显示工具提示,解码表达式中子表达式的含义。如果您对正则表达式有浓厚兴趣,请尝试这两个工具!

历史

原始版本:2003 年 2 月 17 日

版本 1.0.1148:2003 年 2 月 22 日 - 添加了一些附加功能,包括创建程序集文件的能力,以及注册新文件类型 (*.xso) 以支持 Expresso 项目文件。

版本 1.0.1149:2003 年 2 月 23 日 - 添加了工具栏。

我的兄弟 John 不喜欢 Expresso 这个名字,因为他说太多人对 Espresso 的正确拼写和发音感到困惑。不知何故,我怀疑这个程序不会对美国识字率的下降产生任何影响,但谁知道呢。John 更喜欢我之前的名字“Mr. Mxyzptlk”,这是以名字难以发音的超人角色命名的。

有关 Expresso 的最新信息(如有),请参阅 http://www.ultrapico.com/

© . All rights reserved.