2011-05-24 36 views
1

您好我正在處理我的grails應用程序,以至於我通過imap連接到gmail並等待收到的電子郵件。當電子郵件到達時,我需要獲取它的內容,它假設是一個字符串。然後,我需要將此字符串與正則表達式匹配以獲取最有價值的數據。問題是這個字符串有什麼問題,它不符合我在常規多行groovy字符串上測試的正則表達式,並且一切正常。用groovy讀取IMAP郵件內容字符串

def processMessage(def imapMessage){ 
    if(message && message instanceof IMAPMessage){ 
       def content = message.getContent() 
       println 'Content ='+ content 
       m_mailContent = content 
       println 'm_mailContent is ' + m_mailContent 
      } 

然後

def getType(){ 
     def type = 0 
     if(utility.ParseUtil.matches(m_mailContent, WEB_SERVICE_REGEXP)){ 
      type = 1 
     }else if(utility.ParseUtil.matches(m_mailContent, BNET_REGEXP)){ 
      type = 2 
     }else if(utility.ParseUtil.matches(m_mailContent, QUEUED_REGEXP)){ 
      type = 3 
     } 
     return type 
    } 
But i almost always get type = 0 

我可能需要做一些事情該字符串。我不知道我得到了什麼樣的字符串。打印時,一切似乎都很好。當然,它可能是一些特殊的字符,但我逃脫它們?

def WEB_SERVICE_REGEXP = /.*ErrorID:\s*[A-Za-z\d\/\.-]*\n.*Time:\s*[A-Za-z\d\/\s:]*\n.*URL:\s*[A-Za-z\d\/\.]*\n/ 

和一個字符串從Gmail得到的是這樣的

ErrorID: -732861900 
Time:  Tue May 24 09:57:54 CEST 2011 
URL:  /transnet/organisation.jsp 
HttpCode: 500 
Error: class java.lang.SecurityException: Access denied. 
User:  Peter Rådlund (peraa), DHL Express (Sweden) AB 
Domain: DHL Support 

Stacktrace 
---------------------------------------------------------------------- 
java.lang.SecurityException: Access denied. 
     at com.memnon.transnet.admin.Account.checkUpdate(Account.java:725) 
     at com.memnon.transnet.consignment.ConsignmentDB.updateOrganisation(ConsignmentDB.java:152) 
     at org.apache.jsp.transnet.organisation_jsp._jspService(organisation_jsp.java:842) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) 
     at org.apache.catalina.core.A 

我嘗試馬赫像這樣

//ParseUtil 
static def matches(String str, def regexp){ 
      def m = str =~ regexp 
      m.find() 
     } 

我希望這是一種明顯的現在。

+0

發佈您的正則表達式以及您從gmail獲取的一些示例字符串。此外,嘗試通過ParseUtil匹配一個示例字符串,它可能會做一個太嚴格==〜而不是鬆散=〜匹配 – virtualeyes 2011-05-24 08:02:49

+0

什麼是'utility.ParseUtil'在做什麼?「m_mailContent」預期會有什麼值?什麼是「WEB_SERVICE_REGEXP」,「BNET_REGEXP」和「QUEUED_REGEXP」 – 2011-05-24 08:04:19

回答

1
def WEB_SERVICE_REGEXP = /.*ErrorID:\s*[A-Za-z\d\/\.-]*\n.*Time:\s*[A-Za-z\d\/\s:]*\n.*URL:\s*[A-Za-z\d\/\.]*\n/ 

和一個字符串從Gmail得到的是這樣的

ErrorID: -732861900 
Time:  Tue May 24 09:57:54 CEST 2011 
URL:  /transnet/organisation.jsp 
HttpCode: 500 
Error: class java.lang.SecurityException: Access denied. 
User:  Peter Rådlund (peraa), DHL Express (Sweden) AB 
Domain: DHL Support 

Stacktrace 
---------------------------------------------------------------------- 
java.lang.SecurityException: Access denied. 
     at com.memnon.transnet.admin.Account.checkUpdate(Account.java:725) 
     at com.memnon.transnet.consignment.ConsignmentDB.updateOrganisation(ConsignmentDB.java:152) 
     at org.apache.jsp.transnet.organisation_jsp._jspService(organisation_jsp.java:842) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) 
     at org.apache.catalina.core.A 

我嘗試馬赫它像這樣

//ParseUtil 
static def matches(String str, def regexp){ 
      def m = str =~ regexp 
      m.find() 
     } 

我希望現在有點清楚。

我找到了答案。在我的正則表達式中,我搜索「\ n」作爲斷路器,它確實在java字符串上工作,我僞造測試解析,但在Gmail的電子郵件正文(這是純文本/文本內容類型)我應該搜索「\ r \ n 」。它現在有效!我很開心!

非常感謝您的回覆。對此,我真的非常感激。

-1

變化:

static def matches(String str, def regexp){ 
      def m = str =~ regexp 
      m.find() 
     } 

要:

如果你改變 WEB_SERVICE_REGEXP
static def matches(String str, regexp){ 
     (str =~ regexp) 
} 
+0

以上絕對有效;儘管匹配在str =〜regex行中返回,但m.find()返回false。你想要一個布爾結果,所以像這樣包裝(str =〜regex)將返回你正在尋找的東西。毫無根據的downvote,imo。 – virtualeyes 2011-05-24 10:59:54

0

它的工作原理:

def WEB_SERVICE_REGEXP = /(?m)^ErrorID:\s*([A-Za-z0-9\-]+)$[\n]^Time:\s*([A-Za-z\d\/\s:]*)$[\n]^URL:\s*([A-Za-z\d\/\.]*)$/ 

編輯

以下是我有:

def message = ''' 
ErrorID: -732861900 
Time:  Tue May 24 09:57:54 CEST 2011 
URL:  /transnet/organisation.jsp 
HttpCode: 500 
Error: class java.lang.SecurityException: Access denied. 
User:  Peter Rådlund (peraa), DHL Express (Sweden) AB 
Domain: DHL Support 

Stacktrace 
---------------------------------------------------------------------- 
java.lang.SecurityException: Access denied. 
     at com.memnon.transnet.admin.Account.checkUpdate(Account.java:725) 
     at com.memnon.transnet.consignment.ConsignmentDB.updateOrganisation(ConsignmentDB.java:152) 
     at org.apache.jsp.transnet.organisation_jsp._jspService(organisation_jsp.java:842) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) 
     at org.apache.catalina.core.A''' 


def WEB_SERVICE_REGEXP = /(?m)^ErrorID:\s*([A-Za-z0-9\-]+)$[\n]^Time:\s*([A-Za-z\d\/\s:]*)$[\n]^URL:\s*([A-Za-z\d\/\.]*)$/ 

static def matches(String str, def regexp){ 
    def m = str =~ regexp 
    m.find() 
} 

println matches(message, WEB_SERVICE_REGEXP) 

而且,打印

true 
+0

沒有。這是電子郵件字符串的東西。我不知道什麼:( – Natta 2011-05-24 12:37:06

+0

你說電子郵件字符串是_「類似這樣的東西」_...你有沒有工作的電子郵件字符串的實際示例? – 2011-05-24 12:41:02

+0

看看她的問題,示例電子郵件正如她所說,它可以用多行「」「字符串(確認自己)工作,但它在m.find()上斷開,儘管找到匹配,它仍然返回false;因此我的downvoted-but-可能正確答案如下。說起來,downvoter,謹慎解釋?匿名downvotes是有點陰影,而解釋downvotes不是。 – virtualeyes 2011-05-24 13:20:26

相關問題