匹配正则表达式的一部分

时间:2009-12-03 14:05:02

标签: java regex

我必须匹配满足这些条件的星星(*):

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

问题是,我想只匹配这些星星,如果条件为真,怎么办呢(在java中可取:) :(我写的是这样的:

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

但这与星星之间的星星和文字相匹配......)

4 个答案:

答案 0 :(得分: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中,Matcher类中的组计数是1。上述代码中的组计数为2。

如果你不使用这样的非捕获组:

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

结果将返回3组。

详情请参阅此链接:     http://java.sun.com/docs/books/tutorial/essential/regex/groups.html

答案 1 :(得分:0)

您必须使用非贪婪的模式,例如:

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

请注意额外的?字符

答案 2 :(得分:0)

目前尚不清楚为什么要做这样的事情。如果你想“只匹配” - 你的意思是“捕获” - 星星,然后只是测试给定的模式与你的目标字符串,如果它匹配,那么你知道一些文本周围有两颗星,并且正则表达式是否捕获了它们并不重要。这是两颗星!

你究竟想做什么?

答案 3 :(得分:0)

我同意其他回应者:目前还不清楚你要做什么,但如果你想在文本中两个*之间任何,那么:

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

这将在两个*之间找到每个非零长度的字符串。

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