2013-11-01 99 views
2

我想將以下正則表達式應用於字符串。它與Grant Skinners Regexr一起運行良好,它在http://www.regexplanet.com/advanced/java/index.html(區分大小寫的集合)上運行良好,但Java不會吞下它。它從來沒有打到while循環。這裏是我的代碼:正則表達式不起作用

public static void main(String args[]) { 
    final String testString = 
     "lorem upsadsad asda 12esadas [email protected] asdlawaljkads test[at]test" + 
     "[dot]com test jasdsa meter"; 
    final Pattern ptr = 
     Pattern.compile(
     "^[A-Z0-9\\._%+-]+(@|\\s*\\[\\s*at\\s*\\]\\s*)[A-Z0-9\\.-]+" + 
     "(\\.|\\s*\\[\\s*dot\\s*\\]\\s*)[a-z]{2,6}$", 
     Pattern.CASE_INSENSITIVE); 

    try { 
     final Matcher mat = ptr.matcher(testString); 
     while (mat.find()) { 
      final String group1 = mat.group(1); 
      System.out.println(group1); 
      final String group2 = mat.group(2); 
      System.out.println(group2); 
      final String group3 = mat.group(3); 
      System.out.println(group3); 
     } 
    } catch (final Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

你正在做的是什麼正則表達式/代碼?此外,我只是在regexplanet中測試了你的正則表達式,它不匹配你的字符串或者找到任何子字符串。 – Pshemo

+0

你能解釋一下正在做什麼正則表達式? – 2013-11-01 17:50:47

+0

當我使用正則表達式 – user2202911

回答

0
final Pattern ptr = Pattern.compile(
    "\\b([A-Z0-9\\._%+-]+)"+ 
    "(?:@|\\s*\\[\\s*at\\s*\\]\\s*)"+ 
    "([A-Z0-9\\.-]+)"+ 
    "(?:\\.|\\s*\\[\\s*dot\\s*\\]\\s*)"+ 
    "([a-z]{2,6})\\b", Pattern.CASE_INSENSITIVE); 
+1

你爲什麼從原始正則表達式中改變分組? – atomman

+0

OP中正則表達式之後的Java代碼正在尋找三組。很明顯,它試圖以user-domain-TLD格式來匹配電子郵件地址,所以我推測這些組應該對應於地址的這三個部分。 – pobrelkey

+0

雖然我相信你是正確的,並且對這些團體也有同樣的困惑。我覺得應該在你的回答中提及這些類型的暗示。 – atomman

0

爲了簡化你的正則表達式,我將取代[在]和[點]與實際字符第一。然後只需使用標準的電子郵件正則表達式,如:

matches("(?i)\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b"); 
+0

他仍然需要使用'find'而不是'matches'。 'matches'隱式添加'^'和'$',如[這裏]所解釋的(http://stackoverflow.com/questions/4450045/difference-between-matches-and-find-in-java-regex) – atomman

+0

然而,方法是正確的。只需更換[dot]和[at]就可以了。感謝您的回覆 – user2945856

2

沒有必要使用複雜的正則表達式。作爲另一個用戶建議,更換"[dot]"".""[at]""@",即:

myAddressLine = myAddressLine.replace("[dot]", ".").replace("[at]","@"); 

現在,我們可以簡化您的正則表達式來:

Pattern.compile(
"\\b([a-z0-9._%+-]+)@([a-z0-9.-]+)\\.([a-z]{2,6})\\b", Pattern.CASE_INSENSITIVE); 

\\bword boundary,這是你想要的這裏,而不是"^""$"指示開始於分別以結束

請注意,我的capturing groups與您的不同。在此之前,您正在捕獲"@""[dot]"等。現在「用戶名」,「域名」和「頂級域名」正在被捕獲,這就是我所假設的你想要的。

注意:您不需要轉義character classes中的特殊字符,即[.]代表一段時間,[\\.]是不必要的。它仍然正常工作,因爲您需要\\\\實際上匹配\,這是here解釋。

+0

您是對的。我一定是盲目看到這種明顯的溶劑。現在既然這並不反映我原來的問題,我不確定我是否應該將你的答案標記爲正確。但是,這將會很好。 – user2945856

+0

@ user2945856我的意思是,你不必標記它是正確的,但它是一個很好的方法來做到這一點,它的工作原理,所以這是可以接受的。正確並不意味着某件事必須以非常特定的方式回答你的問題。地獄,它甚至不需要是正確的。如果有人給出與您預期不同的答案,但您贊成,那麼接受它就完全可以。如果你想,你可以故意接受一個不好的答案。人們可能會感到不安,但這完全取決於你。 –