我一定要匹配星(*),即滿足這樣的條件:匹配的部分
\*\S.*\S\* -> (for example *y text1 text2 u*)
的問題是,我想只匹配這個明星,如果條件爲真,如何能它做(希望在Java:))(我有寫了這麼:
Pattern params = Pattern.compile("\\*\\S.*\\S\\*");
但這相匹配的恆星和恆星之間的文本......)
我一定要匹配星(*),即滿足這樣的條件:匹配的部分
\*\S.*\S\* -> (for example *y text1 text2 u*)
的問題是,我想只匹配這個明星,如果條件爲真,如何能它做(希望在Java:))(我有寫了這麼:
Pattern params = Pattern.compile("\\*\\S.*\\S\\*");
但這相匹配的恆星和恆星之間的文本......)
可以使用非捕獲組,如下所示:
`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
您必須使用非貪婪模式,如:
Pattern.compile("\\*\\S.*?\\S\\*");
注意額外?
字符
爲什麼你會想要做這樣的事情目前尚不清楚。如果你想「只匹配」 - 你的意思是「捕捉」 - 星星,然後簡單地測試給定的模式對目標字符串,如果匹配,那麼你知道一些文本週圍有兩顆星星,並且正則表達式是否捕獲它們並不重要。這是兩顆星!
你究竟在做什麼?
我同意其他反應:目前還不清楚到底是什麼你正在嘗試做的,但如果你想在文本中包含兩個*的之間什麼,則:
Pattern params = Patterns.compile ("\\*[^\\*]+\\*");
這會發現每一個非兩個*之間的零長度字符串。
有了更多的信息,我們可以提供更好的答案。
注:括號中的逃逸在技術上是不必要的,但我覺得需要把一個*作爲實際字符時,它混淆了人少。 – PSpeed 2009-12-03 15:46:19