Java 正则表达式的匹配部分

Java 正则表达式的匹配部分,java,regex,Java,Regex,我必须匹配满足以下条件的星星(*): \*\S.*\S\* -> (for example *y text1 text2 u*) 问题是,我只想匹配这个星号,如果条件是真的,怎么做(在java中是可取的:)(我写了这样的: Pattern params = Pattern.compile("\\*\\S.*\\S\\*"); 但这会匹配星号和星号之间的文本…您必须使用非贪婪模式,如: Pattern.compile("\\*\\S.*?\\S\\*"); 请注意,附加的?字符不清楚您

我必须匹配满足以下条件的星星(*):

\*\S.*\S\* -> (for example *y text1 text2 u*)
问题是,我只想匹配这个星号,如果条件是真的,怎么做(在java中是可取的:)(我写了这样的:

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

但这会匹配星号和星号之间的文本…

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

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

请注意,附加的
字符不清楚您为什么要这样做。如果你想“只匹配”——你的意思是“捕获”——星星,那么只需根据你的目标字符串测试给定的模式,如果匹配,那么你就知道某个文本周围有两个星星,正则表达式是否捕获它们并不重要。是两颗星


你到底想做什么?

我同意其他回复者的看法:不清楚你到底想做什么,但如果你想在文本中的两个*之间找到任何东西,那么:

Pattern params = Patterns.compile ( "\\*[^\\*]+\\*" );
这将查找两个*之间的所有非零长度字符串


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

您可以使用非捕获组,如下所示:

`Pattern pattern = Pattern.compile("(\\*)(?:\\S.*\\S)(\\*)");`
Pattern pattern = Pattern.compile("(\\*)(\\S.*\\S)(\\*)");
基本上,匹配模式包含3个组:
(\\*),(?:\\S.*\\S),(\\*)
。 第二组类似于(?:re),它是非捕获组,意味着让regex在结果中不计算这个组

以下是示例代码:

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.");
        }



}

}
结果将返回3组

有关详细信息,请参阅此链接:

注意:括号中的转义在技术上是不必要的,但我发现,当需要将*作为实际字符时,它会让更少的人感到困惑。