[英]Finding optional groups with random order using 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等組。...請注意,我可以使用代碼合並組名並捕獲,這沒有問題。
問題是我不知道如何捕獲具有“隨機”位置的可選組。 例如,抄送和密件抄送並不總是出現,但有時會出現,然后我需要捕獲它們。
有人可以幫我解決這個問題嗎?
到目前為止,我所擁有的: (?:-em(?<EMAIL_>to|cc|bcc|from|subject)=(.*))
只需執行以下操作:
-em([^\s=]+)=([^\s]+)
如果您需要支持值的引用,以便它們可以包含空格:
-em([^\s=]+)=("[^"]*"|[^\s]+)
並遍歷命令行arg字符串中的所有匹配項。 對於每個匹配項,請查看“關鍵點”(第一個捕獲組),然后看是否識別出該關鍵點。 如果不是,則顯示錯誤消息並退出。 如果是,請相應地設置選項(第二個捕獲組是“值”)。
POSTSCRIPT:這使我想起了一種為計算機語言編寫語法時經常出現的情況。
有可能(也許甚至很自然)編寫僅適用於語法完美的程序的語法。 但是對於良好的錯誤報告,最好編寫一個語法,該語法接受語法正確的程序的超集 。 獲得解析樹后,您可以對其進行遍歷,查找錯誤並使用特定於應用程序的代碼報告錯誤。
在這種情況下,您可以編寫一個僅與您實際接受的選項匹配的正則表達式。 但是,如果有人輸錯了一個選項,則正則表達式將完全無法匹配。 無論命令行args是否為-emsubjcet=something
或它們是否像@@#$*(#&U*REJDFFKDSJ**&#(*$&##
。
POST-POSTSCRIPT:請注意非常常見的正則表達式模式,它匹配“定界符+任意數量的不是定界符的字符”。 在我上面的正則表達式中,您可以在此處看到以下內容: ([^\\s=]+)=
-1個或多個非空格OR =的字符,后跟=。 這使我們可以輕松地吃掉鑰匙中的所有東西,但不要走得太遠並與定界=
匹配。 您可以在這里再次看到它: "[^"]*"
-一個引號,后跟0個或多個不是引號的字符,后跟一個結束引號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.