我正在尝试使用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)=(.*))
答案 0 :(得分:4)
做一些像:
-em([^\s=]+)=([^\s]+)
如果您需要支持引用值,以便它们可以包含空格:
-em([^\s=]+)=("[^"]*"|[^\s]+)
迭代命令行arg字符串中的所有匹配项。对于每个匹配,请查看“键”(第一个捕获组)并查看它是否是您识别的。如果没有,则显示错误消息并退出。如果是,则相应地设置选项(第二个捕获组是“值”)。
POSTSCRIPT:这让我想起了为计算机语言编写语法时经常出现的情况。
编写一种仅适用于语法上完美的程序的语法是可能的(甚至可能是自然的)。但是对于良好的错误报告,编写一个接受语法正确程序的超集的语法要好得多。获得解析树后,您可以运行它,查找错误,并使用特定于应用程序的代码报告它们。
在这种情况下,您可以编写一个正则表达式,它只匹配您实际接受的选项。但是如果有人错误选择了一个选项,那么正则表达式将无法匹配。无论命令行参数是-emsubjcet=something
还是完全不像@@#$*(#&U*REJDFFKDSJ**&#(*$&##
那样,您的程序将无法提供任何特定的错误消息。
POST-POSTSCRIPT:请注意匹配“分隔符+任意数量的不是分隔符的字符”的常见正则表达式模式。在我的上面的正则表达式中,你可以在这里看到:([^\s=]+)=
- 一个或多个字符,它们不是空格OR =,后跟=。这使我们可以轻松地吃掉作为键的一部分的所有内容,但不能过多地与分隔符=
相匹配。您可以在此处再次看到它:"[^"]*"
- 引号,后跟0个或更多不是引号的字符,后跟一个结束引号。