2

我正在尝试使用正则表达式获得以下内容。

这是示例输入:

-emto=USER@HOST.COM -emfrom=USER@HOST.COM -emsubject="MYSUBJECT" 

其他输入:

-emto=USER@HOST.COM -emfrom=USER@HOST.COM -emcc=ME@HOST.COM -embcc=YOU@HOST.COM -emsubject="MYSUBJECT" 

我想要实现的是使用-em. 所以我想拥有例如组 EMAIL_TO、EMAIL_FROM、EMAIL_CC、... 请注意,我可以使用代码连接组名并捕获,没问题。

问题是我不知道如何捕获具有“随机”位置的可选组。例如,CC 和 BCC 并不总是出现,但有时会出现,然后我需要捕获它们。

有人可以帮我解决这个问题吗?!

到目前为止我所拥有的:(?:-em(?<EMAIL_>to|cc|bcc|from|subject)=(.*))

4

1 回答 1

4

只需执行以下操作:

-em([^\s=]+)=([^\s]+)

如果您需要支持引用值,以便它们可以包含空格:

-em([^\s=]+)=("[^"]*"|[^\s]+)

并遍历命令行 arg 字符串中的所有匹配项。对于每场比赛,查看“关键”(第一个捕获组)并查看它是否是您认识的。如果不是,则显示错误消息并退出。如果是,请相应地设置选项(第二个捕获组是“值”)。

后记:这让我想起了为计算机语言编写语法时经常出现的情况。

可以(甚至很自然地)编写一个只适用于语法完美的程序的语法。但是为了获得良好的错误报告,最好编写一个接受语法正确程序超集的语法。获得解析树后,您可以运行它,查找错误,并使用特定于应用程序的代码报告它们。

在这种情况下,您可以编写一个仅匹配您实际接受的选项的正则表达式。但是,如果有人输入错误的选项,正则表达式将无法匹配。您的程序将无法提供任何特定的错误消息,无论命令行参数是否是,-emsubjcet=something或者它们是否完全像@@#$*(#&U*REJDFFKDSJ**&#(*$&##.

POST-POSTSCRIPT:注意匹配“分隔符 + 任意数量的非分隔符”的非常常见的正则表达式模式。在我上面的正则表达式中,您可以在这里看到:([^\s=]+)=- 1 个或多个不是空格的字符 OR =,后跟 =。这使我们可以轻松地吃掉作为 key 一部分的所有内容,但又不会走得太远并匹配 delimiting =。您可以在这里再次看到它:"[^"]*"-- 引号,后跟 0 个或多个不是引号的字符,然后是右引号。

于 2013-05-13T11:09:58.643 回答