日期:2014-05-19  浏览次数:20689 次

正则表达式 求解(急急急)
Java code

public static void main(String[] args) {
        Pattern p = Pattern.compile("asss(?=2211)");
        Matcher m = p.matcher("asss2211");
        System.out.println(m.matches());
    }



为什么 我用正向匹配 返回的是false 匹配不上

------解决方案--------------------
Pattern p = Pattern.compile("asss(?=2211)\\d*"); 或
Pattern p = Pattern.compile("asss(?=2211).*?");
(?=2211)是向前零宽度正匹配,也就是匹配\\d*或.*?的时候,会向前扫描直到遇到2211为止,如果没有则匹配失败,

Pattern p = Pattern.compile("asss(?=2211)");
后面没有\\d*或.*?的匹配,又怎么能继续向前扫描2211呢,也就是开始匹配asss以后,后面就不知道再去匹配什么了,好歹也出现个.*?之类的才能知道还要继续扫描后面的任意字符啊

同理
Pattern p = Pattern.compile("asss\\d*(?<=2211)"); 或
Pattern p = Pattern.compile("asss.*?(?<=2211)");
也能达到匹配成功Pattern p = Pattern.compile("asss(?=2211)\\d*"); 或
Pattern p = Pattern.compile("asss(?=2211).*?");
(?=2211)是向前零宽度正匹配,也就是匹配\\d*或.*?的时候,会向前扫描直到遇到2211为止,如果没有则匹配失败,

Pattern p = Pattern.compile("asss(?=2211)");
后面没有\\d*或.*?的匹配,又怎么能继续向前扫描2211呢,也就是开始匹配asss以后,后面就不知道再去匹配什么了,好歹也出现个.*?之类的才能知道还要继续扫描后面的任意字符啊

同理
Pattern p = Pattern.compile("asss\\d*(?<=2211)"); 或
Pattern p = Pattern.compile("asss.*?(?<=2211)");
也能达到匹配成功Pattern p = Pattern.compile("asss(?=2211)\\d*"); 或
Pattern p = Pattern.compile("asss(?=2211).*?");
(?=2211)是向前零宽度正匹配,也就是匹配\\d*或.*?的时候,会向前扫描直到遇到2211为止,如果没有则匹配失败,

Pattern p = Pattern.compile("asss(?=2211)");
后面没有\\d*或.*?的匹配,又怎么能继续向前扫描2211呢,也就是开始匹配asss以后,后面就不知道再去匹配什么了,好歹也出现个.*?之类的才能知道还要继续扫描后面的任意字符啊

同理
Pattern p = Pattern.compile("asss\\d*(?<=2211)"); 或
Pattern p = Pattern.compile("asss.*?(?<=2211)");
也能达到匹配成功
------解决方案--------------------
Pattern p = Pattern.compile("asss(?=2211)");
Matcher m = p.matcher("asss2211");
System.out.println(m.matches());



java API那蛋疼的翻译
我还是叫它 肯定顺序环视 好了
肯定顺序环视,匹配的是一个位置(不是一个字符),在该位置的右边,若能成功匹配环视里的子表达式,表示匹配成功

"asss(?=2211)"其实匹配的就是asss这部分,后面的2211正则引擎只会去看下能不能匹配,但不会作为匹配结果

而LZ用了matches,这个方法在正则匹配整个参数的时候才返回true,显然这里没有匹配整个参数字符串

如果改用find方法,该有效果