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

用于正则表达式的方便的 Web 工具

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (3投票s)

2009年10月17日

CPOL

6分钟阅读

viewsIcon

16609

介绍一个免费的基于Web的工具,用于测试正则表达式和执行批量文本转换。

引言

很久以前,我在我的网站上发布了一个小型的正则表达式测试和转换工具(http://www.carljohansen.co.uk/utils/regexpdotnet.aspx)。令我惊讶的是,它非常实用,现在我一直使用它——特别是用于批量转换。我在这里记录它,希望它也能对您有所帮助。

好吧,这里没有什么东西是其他许多应用程序无法提供的。但我的工具的伟大之处在于您无需安装任何特殊软件——只需要一个浏览器。(您需要知道如何使用正则表达式;我所知道的最佳正则表达式参考是www.regular-expressions.info。)

背景

那么,它有什么作用呢?基本上,它为您提供了对.NET Framework的Regex类的一些功能的便捷访问。主要有三个用途:

  1. 测试一个正则表达式,确保它符合您的要求。
  2. 获取一个C#代码片段来执行匹配。
  3. 对文本执行转换(搜索和替换或提取)。

让我们详细看看这些。为了方便对照,您可能想在另一个标签页中打开该工具页面。

测试正则表达式

正则表达式可能难以阅读,并且其语义也难以记住,因此当我创建表达式时,我喜欢在将其放入代码之前用一些示例文本进行测试。假设我们要测试以下用于匹配英国邮政编码的表达式:

[a-zA-Z]{1,2}[0-9][0-9A-Za-z]? [0-9][a-zA-Z]{2}

我们将表达式放在正则表达式框中,并将一些测试用例放在要搜索的文本框中。

G8 3LB
EC12 8QW
A12VL
invalid

然后,我们勾选查找所有匹配项并单击查找(快捷键:Alt+F)。这会在结果框中给出以下输出:

Match #1 (char 1): G8 3LB
Match #2 (char 8): EC12 8QW

正如我们所料,该表达式匹配了前两行,但没有匹配后两行(请注意,结果中的字符索引是1基的,换行符算作一个字符)。

获取C#代码片段

我不知道您怎么样,但我总是记不住.NETRegex类的细节。有了正则表达式测试器,我就不必这样做了。一旦我的表达式在源文本上工作正常(可能选择了一些选项,例如区分大小写),我只需单击显示C#代码(快捷键:Alt+W),就会得到一个用于执行匹配的代码片段。请注意,查找所有匹配项选项决定了应用程序是生成Regex.Match(单个匹配)还是Regex.Matches(所有匹配)的调用。

执行转换

我最初开发正则表达式测试器的目的是测试上面邮政编码示例之类的表达式。但如果只有这个功能,我可能就不会经常使用它了。使这个工具不可或缺的是它执行搜索和替换的能力。此功能有两种模式:替换和提取。在这两种情况下,应用程序都会查找您的正则表达式的所有匹配项,并用您的替换表达式替换每个匹配项。区别在于对非匹配文本的处理:替换会保留它,而提取会将其丢弃。

替换功能

我们先来看看替换。为了说明这一点,让我们构造一个例子。在我们的C#代码中,我们有一堆方法调用(夹杂着注释):

customer1.SetName("F Smith");
customer1.SetAge(31);
//This is a comment that shouldn't be touched during the transformation.
customer2.SetName("J Jones");
customer2.SetAge(42);

现在,假设我们重新设计了Customer类,并且我们想将这些调用转换为对名为NameAge的新属性的赋值。

customer1.Name = "F Smith";
customer1.Age = 31;
//This is a comment that shouldn't be touched during the transformation.
customer2.Name = "J Jones";
customer2.Age = 42;

我们可以手动转换每一行(如果您曾经这样做过,请举手……),但如果有大约十行以上,那么正则表达式转换将为我们节省大量麻烦。首先,我们将原始代码放入要搜索的文本框中,然后我们将此表达式放入正则表达式框中:

^([^\.]+)\.Set([^(]+)\((.*)\);$

勾选多行模式框,以便对^和$(起始和结束锚点)执行逐行匹配。

在进行替换之前,让我们快速检查一下以确保我们的表达式是正确的。将替换文本框留空,勾选查找所有匹配项框,然后单击查找。我们在结果框中得到以下输出:

Match #1 (char 1): customer1.SetName("F Smith");
* Group #1: customer1
* Group #2: Name
* Group #3: "F Smith"
Match #2 (char 31): customer1.SetAge(31);
etc.

这正是我们需要的。我们可以在替换表达式中使用子分组模式$1$2等来引用子分组。将以下表达式放入替换文本框:

$1.$2 = $3;

(请注意,替换文本必须遵循替换模式的规则)。现在,当我们单击替换(快捷键:Alt+R)时,我们将在结果框中得到所需的输出。

请注意,当我们执行替换时,查找所有匹配项框不起作用。默认情况下,替换操作会将正则表达式在源文本中的所有匹配项替换为替换文本。您可以通过在最大替换次数框中输入一个数字来限制替换次数。

提取功能

在那个例子中,我们使用了替换功能,因为我们想在输出中包含非匹配的行(代码注释)。但是,如果我们想丢弃任何不匹配的内容呢?我们也许可以用一个复杂的正则表达式和替换模式来做到这一点,但这会更容易使用提取功能。让我们从《贡多利耶人》的这段文本中提取每行的最后一个单词:

That King, although no one denies
His heart was of abnormal size,
Yet he'd have acted otherwise
    If he had been acuter.
The end is easily foretold,
When every blessed thing you hold
Is made of silver, or of gold,
    You long for simple pewter.
When you have nothing else to wear
But cloth of gold and satins rare,
For cloth of gold you cease to care--
    Up goes the price of shoddy.

In short, whoever you may be,
        To this conclusion you'll agree,
        When every one is somebodee,
            Then no one's anybody!

我们可以用这个来找到每行的最后一个单词:

\b([\w']+)\W*$

勾选多行模式框,以便对$(行尾锚点)执行逐行匹配。

我们可以将替换文本框留空,但那样的话,提取功能将只简单地连续输出所有匹配项。更常见的是,我们会将每个匹配项包装在一些周围的文本中。在这个练习中,我们将简单地用逗号分隔它们,所以将这个替换模式放入替换文本框:

$1,

现在,单击提取(快捷键:Alt+X)将得到以下输出:

denies,size,otherwise,acuter,foretold,hold,gold,
   pewter,wear,rare,care,shoddy,be,agree,somebodee,anybody,

在这个例子中,我们使用了$1来获取包含非标点字符的子分组,但请记住,您也可以使用$0来获取整个匹配的文本。(顺便说一句,对于提取功能,将替换模式留空等同于将其设置为$0。)

替换模式中的换行符

您可能已经注意到替换文本框是多行模式。这允许您在替换模式中输入换行符(通过按Enter!)。例如,在上一个练习中,我们可以用换行符代替逗号来分隔单词。当然,这与在替换模式中输入\n不同。如果您的替换模式包含\n,那么输出将只包含这个:一个反斜杠后跟一个n(在某些情况下这可能是您想要的)。要获得实际的换行符输出,您必须在替换模式中输入实际的换行符。

获取帮助

正则表达式语言对于偶尔使用者来说很难记住(再提醒我一下\w和\W有什么区别?)。正则表达式测试器包含了指向.NET Framework正则表达式参考页面的链接,这些页面应该能回答您关于正则表达式的所有问题。

结论

这些类型操作的可能性是无穷无尽的。当你点击替换并看到50行新代码准备运行时所获得的成就感是无与伦比的。

有一点是肯定的:我不是正则表达式专家。如果您觉得这个工具很有用,或者能看出如何改进它,请告诉我。

© . All rights reserved.