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组
有关详细信息,请参阅此链接:
注意:括号中的转义在技术上是不必要的,但我发现,当需要将*作为实际字符时,它会让更少的人感到困惑。