Вы можете использовать не-захвата групп, как это:
`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.");
}
}
}
Пожалуйста, обратите внимание на Яве счетчик группы в классе Matcher является 1 на основе. Отсчет группы в приведенной выше коде 2.
Если вы не используете не-захват группы, как это:
Pattern pattern = Pattern.compile("(\\*)(\\S.*\\S)(\\*)");
Результат будет возвращать 3 группы.
Для получения дополнительной информации, пожалуйста, смотрите по этой ссылке: http://java.sun.com/docs/books/tutorial/essential/regex/groups.html
Примечания: вылетающий в скобках технически ненужные, но я считаю, что сбивает с толком меньше людей при необходимости поставить * в качестве фактического характера. – PSpeed