当前位置: 代码迷 >> J2SE >> 关于Java正则表达式的非贪婪形式
  详细解决方案

关于Java正则表达式的非贪婪形式

热度:74   发布时间:2016-04-23 20:08:57.0
关于Java正则表达式的非贪婪模式
				 
     Pattern linkPattern = Pattern.compile("\\[.*?\\]\\(.*?\\)");
     Matcher linkMatcher = linkPattern.matcher("[link](www.baidu.com) and [link](www.youku.com)");
     String result = linkMatcher.group();
     System.out.println(result);

运行结果为:[link](www.baidu.com) and [link](www.youku.com)
结果不是应该为[link](www.baidu.com)吗?我用了非贪婪模式啊
------解决思路----------------------
需要先进行查找匹配,才能使用group方法。
其中正则让我做了点修改,在每个匹配点上加了分组,也就是()包裹,用于提取更多信息。
具体代码如下:

Pattern linkPattern = Pattern.compile("\\[(.*?)\\]\\((.*?)\\)");
Matcher linkMatcher = linkPattern
.matcher("[link](www.baidu.com) and [link](www.youku.com)");
while(linkMatcher.find()){
String result = linkMatcher.group();
System.out.println(result);
System.out.println(linkMatcher.group(1));
System.out.println(linkMatcher.group(2));
}

------解决思路----------------------
在使用group时一定要调用find(),否则会产生编译错误,代码如下:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ZhengZe {
public static void main(String[] args) {
 Pattern linkPattern = Pattern.compile("\\[.*?\\]\\(.*?\\)");
     Matcher linkMatcher = linkPattern.matcher("[link](www.baidu.com) and [link](www.youku.com)");
     while(linkMatcher.find())
     {
     String result = linkMatcher.group();
     System.out.println(result);
     }

}
}

结果:
[link](www.baidu.com)
[link](www.youku.com)

------解决思路----------------------
要想只得到一个匹配结果,就对正则进行分组,然后用group(0)表示全部,group(1)只匹配第一个分组,group(2)只匹配第二个分组……以此类推
------解决思路----------------------
Pattern linkPattern = Pattern.compile("\\[.*?\\]\\(.*?\\)");
Matcher linkMatcher = linkPattern.matcher("[link](www.baidu.com) and [link](www.youku.com)");
if(linkMatcher.find()){
String result = linkMatcher.group(0);
System.out.println(result);
}

结果是[link](www.baidu.com),正是贪婪匹配的结果。
  相关解决方案