使用正则表达式查找具有随机顺序的可选组

时间:2013-05-13 10:43:06

标签: c# regex

我正在尝试使用Regex获得以下内容。

这是示例输入:

-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)=(.*))

1 个答案:

答案 0 :(得分:4)

做一些像:

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

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

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

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

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

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

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

POST-POSTSCRIPT:请注意匹配“分隔符+任意数量的不是分隔符的字符”的常见正则表达式模式。在我的上面的正则表达式中,你可以在这里看到:([^\s=]+)= - 一个或多个字符,它们不是空格OR =,后跟=。这使我们可以轻松地吃掉作为键的一部分的所有内容,但不能过多地与分隔符=相匹配。您可以在此处再次看到它:"[^"]*" - 引号,后跟0个或更多不是引号的字符,后跟一个结束引号。