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

名字不好取_蛋疼 2012-05-11 04:31:27

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


为什么 我用正向匹配 返回的是false 匹配不上
...全文
127 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
MikanMu 2012-08-20
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("asss(?=2211)");
Matcher m = p.matcher("asss2211");
while(m.find()){
System.out.println(m.group());
}
xwmr1988 2012-05-12
  • 打赏
  • 举报
回复
路过看看,好久没登了,顶起
qybao 2012-05-12
  • 打赏
  • 举报
回复
出问题了,我才复制粘贴一次就出现这么多次
重新贴一次吧

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)");
也能达到匹配成功
龙四 2012-05-12
  • 打赏
  • 举报
回复
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方法,该有效果
qybao 2012-05-11
  • 打赏
  • 举报
回复
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)");
也能达到匹配成功

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧