【问题标题】:Finding optional groups with random order using regex使用正则表达式查找具有随机顺序的可选组
【发布时间】:2013-05-13 10:43:05
【问题描述】:

我正在尝试使用 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)=(.*))

【问题讨论】:

  • 什么语言?您可以在空格上拆分,然后在 =
  • 您好,感谢您的评论。主题可以包含空格...
  • + 我想要一个正则表达式解决方案。 =)
  • 你的应用语言是什么???

标签: c# regex


【解决方案1】:

只需执行以下操作:

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

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

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

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

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

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

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

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

【讨论】:

  • 主题包含空格时似乎有问题?
  • 主题被空格破坏,示例输入数据:-emto=USER@HOST.COM -emfrom=USER@HOST.COM -emcc=ME@HOST.COM -embcc=YOU@HOST.COM -emsubject="ALI/PL_LIVE: ZAMÓWIENIE ZAKUPU"
  • 好的,我添加了一个可以涵盖这种情况的正则表达式。享受吧!
  • 谢谢亚历克斯,但是当我测试这个正则表达式时,我只剩下"ALIPL_LIVE: ...我认为吃而不是“不覆盖主题空间?
  • 如果我删除值的第一个逻辑表达式,那么我就有了主题。那么使用OR...一定有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多