2012-02-03 55 views
2

以下代碼匹配兩個表達式並打印成功。Pattern.COMMENTS始終導致Matcher.find失敗

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    public static void main(String[] args) { 

     String regex = "\\{user_id : [0-9]+\\}"; 
     String string = "{user_id : 0}"; 

     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(string); 

     if (matcher.find()) 
      System.out.println("Success."); 
     else 
      System.out.println("Failure."); 
    } 
} 

但是,我想空白空間並不重要,所以下面也應該打印成功。

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    public static void main(String[] args) { 

     String regex = "\\{user_id:[0-9]+\\}"; 
     String string = "{user_id : 0}"; 

     Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS); 
     Matcher matcher = pattern.matcher(string); 

     if (matcher.find()) 
      System.out.println("Success."); 
     else 
      System.out.println("Failure."); 
    } 
} 

Pattern.COMMENTS標誌是應該允許空白空間,但它會導致要打印故障。如果字符串完全相同(包括空格),甚至會導致打印失敗,如第一個示例中所示。例如,

import java.util.regex.Matcher; import java.util.regex.Pattern;

public class Test { 

    public static void main(String[] args) { 

     String regex = "\\{user_id : [0-9]+\\}"; 
     String string = "{user_id : 0}"; 

     Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS); 
     Matcher matcher = pattern.matcher(string); 

     if (matcher.find()) 
      System.out.println("Success."); 
     else 
      System.out.println("Failure."); 
    } 
} 

打印失敗。

爲什麼會發生這種情況,我該如何讓模式忽略空白?

+0

我複製你的第二個主要方法的內容和它的工作對我來說,它打印「成功。」。 – stema 2012-02-03 06:59:17

+0

對不起,我切換了哪個字符串,我想要空格。現在它是固定的。 – gsingh2011 2012-02-03 07:17:08

回答

7

您的身邊存在誤解。 Pattern.COMMENTS允許你在你的正則表達式中加入額外的空格,以提高正則表達式的可讀性,但是這個空格不會在字符串中匹配。

這不允許字符串中的空格,然後自動匹配,而不在正則表達式中定義。

隨着Pattern.COMMENTS你可以把空白在您的正則表達式這樣

String regex = "\\{ user_id: [0-9]+ \\}"; 

改善readablitiy,但它不會匹配字符串

String string = "{user_id : 0}"; 

因爲你沒有定義字符串中的空格,所以如果你想使用Pattern.COMMENTS那麼你需要治療空白要特別匹配,要麼你逃避它

String regex = "\\{ user_id\\ :\\ [0-9]+ \\}"; 

或使用空白類

String regex = "\\{ user_id \\s:\\s [0-9]+ \\}"; 
+0

好吧,這就是爲什麼我添加的第三個例子失敗了?是否有可能得到它,以便正則表達式可以有多餘的空格,並匹配字符串是否沒有空白或一些空格? – gsingh2011 2012-02-03 07:23:56

+0

是的,我還在我的回答中添加了一個例子 – stema 2012-02-03 07:27:15

+0

'\\ s *'通常是匹配可選空白的好主意。 – stema 2012-02-03 07:30:02