2012-01-19 24 views
1

我曾嘗試使用以下類型的正則表達式的爲什麼心不是這個正則表達式回溯工作

([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))|(FakeEmail:)|(Email:)|(\1\2)|(\1\3) 

(假裝\ 1是電子郵件正則表達式組,和\ 2 FakeEmail:和\ 3電子郵件:因爲我沒有算括號找出真正的分組)

我所試圖做的是說「查找單詞電子郵件:如果你找到它,拿起任何電子郵件地址字下面的」

該電子郵件正則表達式我得到了關於堆棧溢出的其他問題。

我的測試字符串可以是這樣的

"This guy is spamming me from 
FakeEmail: [email protected] 
but here is is real info: 
Email: [email protected]" 

任何提示嗎?謝謝

回答

0

我對你想要做什麼感到困惑,或者你的正則表達式錯了。特別是:

爲什麼你在最後有Email:而不是開頭 - 來匹配你的例子?

你爲什麼把你的Email:和你的\1\2用管道字符分開,就好像它們在字段中一樣?這是將該模式編譯爲OR。 (找到電子郵件模式,或「電子郵件:」,或任何\1\2將最終意義,因爲它是在這裏的背景)。

如果你所要做的只是匹配類似Email: [email protected],你不喜歡不需要任何回溯。

像這樣的東西可能是你所需要的:

Email:\s+([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})) 

而且,我會強烈建議不要嘗試這樣嚴格驗證的電子郵件地址。您可能想要閱讀http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx。我想簡化圖案的線沿線的東西更多:

Email:\s+(\S+)*@(\S+\.\S+) 
+0

我修改的例子是更現實的。我有這樣的正則表達式結構,因爲我真的想嘗試挑選出假冒和真正的電子郵件,重新使用電子郵件正則表達式 – Derek

0

嘗試:

(Fake)?Email: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})) 

,抓獲組\1將是空的,如果它是真實的電子郵件和遏制「假」,如果它是一個假電子郵件,而\2將是電子郵件本身。

你真的想捕捉它,如果它是FakeEmail有關係嗎?如果你想捕獲所有Email但忽略所有FakeEmail然後執行:

\bEmail: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})) 

字邊界防止Email位從匹配「FakeEmail」。

UPDATE:注意你的正則表達式只是因爲它有a-z[]無處不在,但不是[A-Z]匹配小寫。確保使用忽略大小寫開關將您的正則表達式提供給java匹配函數。即:

Pattern.compile("(Fake)?Email: .....", Pattern.CASE_INSENSITIVE) 
+0

我修改了這個例子,使其更加真實。我有這樣的正則表達式結構,因爲我真的想嘗試挑選出假冒和真正的電子郵件,重新使用電子郵件正則表達式 – Derek

+0

好了,更新了答案。 –

+0

我最終想要捕捉所有的電子郵件 - 我只關心真正的電子郵件。此外,這似乎並沒有工作 – Derek

0

您可以使用下面的代碼來匹配所有類型的電子郵件地址:

String text = "This guy is spamming me from\n" + 
    "FakeEmail: [email protected]\n" + 
    "fakeEmail: \n" + 
    "[email protected]" + 
    "but here is is real info:\n" + 
    "Email: [email protected]\n"; 

Matcher m = Pattern.compile("(?i)(?s)Email:\\s*([_a-z\\d\\+-]+(\\.[_a-z\\d\\+-]+)*@[a-z\\d-]+(\\.[a-z\\d-]+)*(\\.[a-z]{2,4}))").matcher(text); 
while(m.find()) 
    System.out.printf("Email is [%s]%n", m.group(1)); 

這將匹配電子郵件正文:

  • 出現在不同線路上使用(?s)
  • 忽略使用案例比較(?i)
  • 電子郵件廣告在它

OUTPUT一段.在它

  • 電子郵件地址以加號+穿着:從上面的代碼是

    Email is [[email protected]] 
    Email is [[email protected]] 
    Email is [[email protected]] 
    
  • 相關問題