我必须匹配满足这些条件的星星(*):
\*\S.*\S\* -> (for example *y text1 text2 u*)
问题是,我想只匹配这些星星,如果条件为真,怎么办呢(在java中可取:) :(我写的是这样的:
Pattern params = Pattern.compile("\\*\\S.*\\S\\*");
但这与星星之间的星星和文字相匹配......)
答案 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 ( "\\*[^\\*]+\\*" );
这将在两个*之间找到每个非零长度的字符串。
有了更多信息,我们可以提供更好的答案。