2012-07-03 95 views
0

我的問題:什麼是下面解析信息的好方法?正則表達式的電子郵件地址了XML的

我有一個Java程序,它從XML得到它的輸入。如果處理中有任何問題,我有一個功能會發送一封錯誤郵件。由於解析XML可能是一個問題,我想有一個功能,將能夠對正則表達式的郵件了XML的(因爲如果分析是問題,那麼我不能讓錯誤的郵件了XML的正常)。

要求:

  • 我希望能夠解析到,CC和BCC seperately屬性
  • 有哪些要,CC等元素,和BCC屬性
  • 空白沒關係,所以我的示例可能會在換行符上顯示屬性,但情況並非總是如此。
  • 屬性的順序無關緊要。

這裏是XML的例子:

<error_options 
    to="[email protected]_server.com" 
    cc="[email protected]_server.com" 
    bcc="[email protected]_server.com" 
    reply_to="[email protected]_server.com" 
    from="[email protected]_server.org" 
    subject="Error running System at @@[email protected]@" 
    force_send="false" 
    max_email_size="10485760" 
    oversized_email_action="zip;split_all" 
> 

我想這error_options.{0,100}?to="(.*?)",但匹配我拉下reply_to。這讓我覺得可能有些情況下我可能會錯過,這就是爲什麼我把這張貼作爲一個問題。

+2

不要使用正則表達式來解析XML/HTML正確解析它,只是提取你關心的屬性/值對 – Petesh

+0

好吧,就像我說的,其中一個功能是發送電子郵件給用戶,如果他們的XML *不*正確解析。 – kentcdodds

+0

你是什麼意思「不正確解析」,XML解析器無法繼續讀取它? –

回答

1

這塊就會把所有的屬性從String s="<error_options..."成圖:

Pattern p = Pattern.compile("\\s+?(.+?)=\"(.+?)\\s*?\"",Pattern.DOTALL); 
    Map a = new HashMap() ; 
    Matcher m = p.matcher(s) ; 
    while(m.find()) { 
     String key = m.group(1).trim() ; 
     String val = m.group(2).trim() ; 
     a.put(key, val) ; 
    } 

...那麼你就可以提取出你感興趣的從該地圖的值。

+0

哇!這很簡單,但很精彩!謝謝你的提示! – kentcdodds

+1

如果'='會在主題文本中出現? –

+0

@Ωmega這會弄糟一件事。謝謝你的提醒! – mazaneicha

1

這個問題類似於RegEx match open tags except XHTML self-contained tags。永遠不要用正則表達式解析XML或HTML。 Java中有很多XML解析器實現可以正確執行此任務。閱讀文檔並逐個解析屬性。

不介意,如果沒有很好地形成的用戶XML,解析器可以處理大量的草率。

1
/<error_options(?=\s)[^>]*?(?<=\n)\s*to="([^"]*)"/s; 
/<error_options(?=\s)[^>]*?(?<=\n)\s*cc="([^"]*)"/s; 
/<error_options(?=\s)[^>]*?(?<=\n)\s*bcc="([^"]*)"/s; 
+0

不知怎的,我得到[不同的結果(http://regexr.com?31e7f) – kentcdodds

+0

@kentcdodds - 你有'\ r'輸入 - 見http://regexr.com?31e7r –

+0

真棒。 +1幫助我實現這個目標。謝謝! – kentcdodds

相關問題