匹配的部分
问题描述:
我一定要匹配星(*),即满足这样的条件:匹配的部分
\*\S.*\S\* -> (for example *y text1 text2 u*)
的问题是,我想只匹配这个明星,如果条件为真,如何能它做(希望在Java:))(我有写了这么:
Pattern params = Pattern.compile("\\*\\S.*\\S\\*");
但这相匹配的恒星和恒星之间的文本......)
答
可以使用非捕获组,如下所示:
`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中的匹配器类中的组数是基于1。在上面的代码中的组数为2
如果你不使用非捕获组是这样的:
Pattern pattern = Pattern.compile("(\\*)(\\S.*\\S)(\\*)");
结果将返回3组。
有关详细信息,请参考以下链接: http://java.sun.com/docs/books/tutorial/essential/regex/groups.html
答
您必须使用非贪婪模式,如:
Pattern.compile("\\*\\S.*?\\S\\*");
注意额外?
字符
答
为什么你会想要做这样的事情目前尚不清楚。如果你想“只匹配” - 你的意思是“捕捉” - 星星,然后简单地测试给定的模式对目标字符串,如果匹配,那么你知道一些文本周围有两颗星星,并且正则表达式是否捕获它们并不重要。这是两颗星!
你究竟在做什么?
答
我同意其他反应:目前还不清楚到底是什么你正在尝试做的,但如果你想在文本中包含两个*的之间什么,则:
Pattern params = Patterns.compile ("\\*[^\\*]+\\*");
这会发现每一个非两个*之间的零长度字符串。
有了更多的信息,我们可以提供更好的答案。
注:括号中的逃逸在技术上是不必要的,但我觉得需要把一个*作为实际字符时,它混淆了人少。 – PSpeed 2009-12-03 15:46:19