2013-05-12 49 views
3

我想匹配的東西和我的生活我無法弄清楚爲什麼它不能按預期工作。爲什麼Pattern不能匹配「/ *!」?

字符串:"/*! preserved */"

模式:

Pattern.compile("(/[*][!](?:.+?)[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- FAIL 

模式:

Pattern.compile("(/[*](?:.+?)[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- PASS 

我只是想趕上開幕註釋字符串之後有一個!意見。我甚至嘗試降低比賽剛剛/*!

Pattern.compile("(/[*][!])", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- FAIL 

Pattern.compile("(/[*!]{2})", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- FAIL 

Pattern.compile("(/[*][!])", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- FAIL 


Java Version "1.6.0_43" 
Java(TM) SE Runtime Environment (build 1.6.0_43-b01) 
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode) 

編輯

此操作失敗,這沒有任何意義對我來說,因爲我的模式沒有開始或要求結束:

Pattern p = Pattern.compile("(/[*]!.+?[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */"); 
System.out.println("Pattern: " + p); 
System.out.println("Group: " + m.group(1)); 
System.out.println("Found: " + m.find()); 

即使減少它只是匹配/*!失敗:

Pattern p = Pattern.compile("(/[*]!)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */"); 
System.out.println("Match: " + m.find()); 
System.out.println("Pattern: " + p); 
System.out.println("Group: " + m.group(1)); 
+1

'*'是一個特殊字符,像這樣轉義它'''*'' – Doorknob 2013-05-12 03:03:26

+8

@ doorknob將'*'放在'[]'中,就像他做的一樣,它使它匹配一個字面的'*'。 – Kevin 2013-05-12 03:06:56

回答

3
Pattern p = Pattern.compile("(/[*]!.+?[*]/)", Pattern.MULTILINE | Pattern.DOTALL 
      | Pattern.CASE_INSENSITIVE); 
    System.out.println(p.matcher("/*! preserved */").matches()); 

輸出

true 
+0

謝謝,我不得不嘮叨一下,我仍然困惑爲什麼m.find()返回false,但我更新我的代碼使用m.matches() – Digitalxero 2013-05-12 04:21:48

+0

事實上,您的模式#1工作對我來說,對於尋找和匹配都很好。我只是想表明它的工作原理,而且表達可以簡化一點。我不知道它是怎麼來的不適合你 – 2013-05-12 04:47:10

+0

如果你在評論之前或之後添加任何文字 – Digitalxero 2013-05-12 06:52:35

-2

一個實例基於字符串API itshelf用於驗證的密碼。

String password = "Velu1!"; 
    String pattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]#$%^&*+=_-])(?=\\S+$).{6,100}$"; 
    if (!password.matches(pattern)) { 
     System.out.println("Invalid Password!"); 
    } else { 
     System.out.println("Valid Password!"); 
    } 

在這種情況下,你的模式是

String pattern = "(/[*]!.+?[*]/)"; 
+0

這是如何解決這個問題? – 2013-05-12 04:30:13

+0

@MikeSamuel這是我在新學習的字符串API中的Java模式/匹配器的替代方案。對於那些使用模式/匹配器的人而言,他們只能使用String API。 – 2013-05-12 04:35:21

2

Javadoc中採取了matcher.find()

public boolean find() 

試圖找到該模式匹配的輸入序列的下一個子。該方法從該匹配器的區域的開始處開始,或者如果之前的方法調用成功並且匹配器尚未被重置,則在與先前的匹配不匹配的第一個字符處開始。

如果匹配成功,則可以通過start,endgroup方法獲得更多信息。

返回:

true如果,且僅當輸入序列的子序列匹配此匹配器模式

查找開始從最後一場比賽結束搜索。不是從字符串的開頭。這就是m.find()返回false的原因。

你可以看到這個例子。

Pattern p = Pattern.compile(".*(/[*]!.+?[*]/).*", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */"); 
//System.out.println("Match: " + m.matches()); 
//System.out.println("Pattern: " + p); 
//System.out.println("Group: " + m.group(1)); 
System.out.println("Found: " + m.find()); 

這將返回true。但是,如果您取消註釋其他行,m.find()將返回false。

如果您在致電m.find()之前調用m.reset(),您將能夠判斷該模式是否在字符串中的任何位置。但是,這會重置匹配器的狀態,這可能不合意。

編輯:

若要通過只使用發現使用下面的代碼中找到的所有比賽。 (注意失蹤.*

Pattern p = Pattern.compile("(/[*]!.+?[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */"); 
while(m.find()) { 
    System.out.println(m.group()); 
} 

輸出

/*! preserved */ 
/*! preserved1 */ 

由於Matcher.matches()必須需要一個稍微複雜的正則表達式查找這可能是不可取的所有比賽的整個字符串相匹配。

+0

事情是OP的模式消耗整個字符串(注意後面的'。*'),還有前面的'。*',所以他找不到所有的匹配。即使你使用find(),問題也沒有解決。 – nhahtdh 2013-05-12 04:51:19

+0

@FDinoff爲了完成它,我認爲你還應該指出'matches()'必須匹配整個字符串才能返回'true'。此外,還需要在調用'matches()'之後調用'reset()'(在調用'find()'之前)。 – acdcjunior 2013-05-12 16:01:03

+0

@nhahtdh我編輯帖子以顯示如何使用find()查找所有匹配項 – FDinoff 2013-05-12 16:45:42