匹配的部分

问题描述:

我一定要匹配星(*),即满足这样的条件:匹配的部分

\*\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 ("\\*[^\\*]+\\*"); 

这会发现每一个非两个*之间的零长度字符串。

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

+0

注:括号中的逃逸在技术上是不必要的,但我觉得需要把一个*作为实际字符时,它混淆了人少。 – PSpeed 2009-12-03 15:46:19