2009-12-03 124 views
1

我一定要匹配星(*),即滿足這樣的條件:匹配的部分

\*\S.*\S\* -> (for example *y text1 text2 u*) 

的問題是,我想只匹配這個明星,如果條件爲真,如何能它做(希望在Java:))(我有寫了這麼:

Pattern params = Pattern.compile("\\*\\S.*\\S\\*"); 

但這相匹配的恆星和恆星之間的文本......)

回答

2

可以使用非捕獲組,如下所示:

`Pattern pattern = Pattern.compile("(\\*)(?:\\S.*\\S)(\\*)");` 

基本上,匹配模式包含3組:(\\*), (?:\\S.*\\S), (\\*)。 第二組就像(?:re),它是非捕獲組,意味着讓正則表達式不計算結果中的這個組。

下面是示例代碼:

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

public class RegexTest { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 


     Pattern pattern = Pattern.compile("(\\*)(?:\\S.*\\S)(\\*)"); 

     String string ="for example *y text1 text2 u*"; 
     Matcher matcher = pattern.matcher(string); 

     boolean found = false; 
     if (matcher.find()) { 
      System.out.println("group count:"+matcher.groupCount()); 
      System.out.println("---------------"); 
      for(int i=1; i<=matcher.groupCount(); i++) 
      { 
       System.out.println("group "+i); 
       System.out.println("start index:"+matcher.start(i)); 
       System.out.println("end index:"+matcher.end(i)); 
       System.out.println("text:"+string.substring(matcher.start(i), matcher.end(i))); 
       System.out.println("---------------"); 
      } 

      found = true; 
     } 
     if(!found){ 
      System.out.println("not found."); 
     } 



} 

} 

請注意,在Java中的匹配器類中的組數是基於1。在上面的代碼中的組數爲2

如果你不使用非捕獲組是這樣的:

Pattern pattern = Pattern.compile("(\\*)(\\S.*\\S)(\\*)"); 

結果將返回3組。

有關詳細信息,請參考以下鏈接: http://java.sun.com/docs/books/tutorial/essential/regex/groups.html

0

您必須使用非貪婪模式,如:

Pattern.compile("\\*\\S.*?\\S\\*"); 

注意額外?字符

0

爲什麼你會想要做這樣的事情目前尚不清楚。如果你想「只匹配」 - 你的意思是「捕捉」 - 星星,然後簡單地測試給定的模式對目標字符串,如果匹配,那麼你知道一些文本週圍有兩顆星星,並且正則表達式是否捕獲它們並不重要。這是兩顆星!

你究竟在做什麼?

0

我同意其他反應:目前還不清楚到底是什麼你正在嘗試做的,但如果你想在文本中包含兩個*的之間什麼,則:

Pattern params = Patterns.compile ("\\*[^\\*]+\\*"); 

這會發現每一個非兩個*之間的零長度字符串。

有了更多的信息,我們可以提供更好的答案。

+0

注:括號中的逃逸在技術上是不必要的,但我覺得需要把一個*作爲實際字符時,它混淆了人少。 – PSpeed 2009-12-03 15:46:19