浏览 2772 次
锁定老帖子 主题:java 正则中的正向预查的问题?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-08
最后修改:2009-09-09
正向预查的意思就是比如你要查 finds 中的find 按finds来查 但是真正的匹配结果又不算s Pattern p = Pattern.compile("order\\s+by.+?(?=\\))"); //这个代码中的换成Pattern p = Pattern.compile("order\\s+by.+(?=\\))");结果依旧.(就是不要贪婪模式) String query="dfaf order by hx ) dfadf"; Matcher m = p.matcher(query); while(m.find()){ query=query.replace(m.group(),""); m.reset(query); } System.out.println(query); 运行上面这对代码期望是得到dfaf dfadf 但是实际得到的是dfaf ) dfadf 首先怀疑是不是因为)是正则中的特殊符号(事实上已经加上\\处理过了) 然后稍稍改动代码 Pattern p = Pattern.compile("order\\s+by.+(?=m)"); String query="dfaf order by hx m dfadf"; Matcher m = p.matcher(query); while(m.find()){ //System.out.println(m.toString()); query=query.replace(m.group(),""); m.reset(query); } System.out.println(query); 这回匹配m字符 结果:运行上面这对代码期望是得到dfaf dfadf 但是实际得到的是dfaf m dfadf 真不知道是怎么回事了。。。 难道是bug? 请各位看看我是不是对java中的正向预查理解有误 另外,试了下javascript中的正向预查 <script> var sql="select dfd from dfa (order by hx) dfdf order by end"; var reg=/order\s+by.+(?=\))/; alert(sql.replace(reg,"")); </script> 结果很正常:)被保留了 自己试着做个分页中出现的问题。。 GOOGLE一搜 到处都是正则的匹配语法,没有正向预查的例子 , 我想这些匹配的规定我都懂了。。。 没想到还有这么一个问题 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-09
有没有人试过我的代码啊 你们结果是怎么样的?
|
|
返回顶楼 | |
发表时间:2009-09-09
楼主……
你先把最后在JavaScript里的正则表达式改回:/order\s+by.+?(?=\))/ 然后把匹配的源字符串改回到:"dfaf order by hx ) dfadf" 然后你alert出来的结果就是:dfaf ) dfadf 跟JDK里的一模一样对吧? 其实JDK做的就是你在正则表达式里要求它的:在源字符串里寻找这样一个子串,开头是order,接着一个或多个空白字符,然后是by,然后是任意字符,直到匹配到这样一个位置,它的右边是一个右括号。既然匹配到的子串在最后的一个“位置”的右边是右括号,也就是说匹配内容不包括那个右括号,替换的时候自然就没有替换掉它了。如果顶楼最后一个例子就是你要的行为,那前面两个例子也一样是你要的行为…… |
|
返回顶楼 | |
发表时间:2009-09-09
。。。。。。 我懂了。。。 唉 我傻了。
结果一直都是正常的。。 丢人了 我都不好意思谢谢楼上了。 |
|
返回顶楼 | |