当前位置: 代码迷 >> J2SE >> 最短匹配的正则表达式如何写
  详细解决方案

最短匹配的正则表达式如何写

热度:99   发布时间:2016-04-24 01:58:03.0
最短匹配的正则表达式怎么写?
a1234567ab

我想匹配以a开头,b结尾的最短的,就是要取其中的ab

但用(?<=a).*?(?=b)只能找到a1234567ab

怎样才能找到ab?

谢谢!

------解决方案--------------------
只用正则ms不行,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权
它肯定是先从第一个a开始匹配的。
可以和javaAPI(java.util.regex )配合起来,查到一个匹配的字符串后,在这个字符串里再次匹配一次或多次(就是递归操作),这样可以获得最短的匹配字符串
------解决方案--------------------
可以限定一个范围:
Java code
import java.util.regex.*;public class MyRegex {    public static void main(String[] args) {        String str="a1234567ab ";        Matcher m=Pattern.compile("a(.{0,5})b").matcher(str);        while(m.find())            System.out.println(m.group());    }}
------解决方案--------------------
a1234b567ab
二楼的意思是 光用正则表达式只能解决取 a1234b 不取a1234b567ab的问题。
加上点 java 代码应该可以解决这个问题。
Java code
    public static void getShortest(){        String str ="a1234b567ab";        String result = str;        Pattern p = Pattern.compile("a.*?b", Pattern.MULTILINE);        Matcher m=p.matcher(str);        while(m.find()){            System.out.println(m.group());             if(result.length() > m.group().length()) {                result = m.group();            }        }                System.out.println("the shortest is :" + result);     }
------解决方案--------------------
懒惰好像没什么用 
((?<=a).*[^a](?=b))这样吧