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

本文关键字:顺序 随机 正则表达式 查找 | 更新日期: 2023-09-27 18:13:13

我正在尝试使用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,…注意,我可以使用代码连接组名和捕获,没有问题。

问题是我不知道如何捕获具有"随机"位置的可选组。例如,抄送和密件并不总是出现,但有时它们会出现,然后我需要捕捉它们。

谁能帮我解决这个问题?

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

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

就这样做:

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

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

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

遍历命令行参数字符串中的所有匹配项。对于每个匹配,查看"键"(第一个捕获组),看看它是否是您认识的。如果没有,则显示错误消息并退出。如果是,设置相应的选项(第二个捕获组是"value")。

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

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

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

POST-POSTSCRIPT:注意非常常见的匹配"分隔符+任意数目的非分隔符字符"的正则表达式模式。在我上面的正则表达式中,您可以在这里看到:([^'s=]+)=—1个或多个不是空白或=的字符,后面跟着=。这使我们可以很容易地吃掉所有的东西,这是关键的一部分,但不会走得太远,并匹配分隔=。您可以在这里再次看到它:"[^"]*"——一个引号,后面跟着0个或多个不是引号的字符,后面跟着一个结束引号。