正则表达式,sswater(光杆兵)等高手请进! 该贴跟下面的贴相关http://community.csdn.net/Expert/topic/4443/4443414.xml?temp=.189892 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 随便问一下sswater(光杆兵):我在eclipse或myeclipce中执行多文件查找(?<!\)\s{0,1000})log\.debug(?![^{]*\})时,查找结果不正确,但在单文件中查找正确,不过有点慢,你那有这个问题没有? 我后来想起来了,我这个写法在 rambostar 兄 给出的: if (log.isDebugEnabled()) { log.debug("********** :"); } if (log.isDebugEnabled()) log.debug("********** :"); if (log.isDebugEnabled()) log.debug("********** :"); log.debug("********** :");//只有这句是我要查找的 //log.debug("********** :"); if (log.isDebugEnabled()) { log.debug("ReportClientDocument initialization finished."); log.debug("ReportHandler.initialize() End."); }这段例子代码中是没问题的,但是放到具体程序中好像不行。我的思路是这样的: 既然楼主要求前面不能有 "{" ,那么 log.debug 后边也不能有 "}"(但是后边可以是{}对)因此, rambostar 兄 给出的这段例子是可以的。但是放入了程序中的时候,后边不可能没有 "}",因此放入程序中不行。 rambostar 兄 的后来这个要求的确不好办,我最后给出的那个表达式也只适合 rambostar 兄 举出的例子。如果有更好的解决办法,我再继续跟贴。 谢谢sswater(光杆兵) 兄啊,解决问题后,我还要开个新帖,这样才对得住sswater(光杆兵)的才智慧啊! 我看了http://www.regexlab.com/zh/regref.htm,但还是对log\.debug(?![^{]*\})理解不深刻,(?![^{]*\})应该表示后面不存在[^{]*\}的代码,不明白为什么需要[^{]*,而[^#]*就不行,请sswater(光杆兵)兄能否详细解释一下。 我后来得到表达式为:(?<!\)\s{0,500})log\.debug(?![^{}]*(?<=isDebugEnabled\(\)\)\s{0,200}\{[^{}]{0,500})\})---------------------------------------------------------说明:(?![^{]\})根据后边是否有 "}" 来决定是否要过滤掉当前的 "log.debug"。如果后边 "}" 之前还有 "{",那么这个 "log.debug" 仍然要匹配。就是说log.debug....; // 这个 log.debug 的后边有 "}",但中间还有 "{",因此,这个是要匹配{ log.debug...; // 这个 log.debug 不匹配,过滤掉。}因此:"[^{]*\}" 可以,而 "[^#]*}" 不可以。------------------------------------------------------------------我昨天所说的 "具体程序中好像不行" 是说:光凭后边是否有 "}" 来决定是不正确的。因为在具体程序中,肯定是这样的:public class xxx{ public void xxxfun() { log.debug(...); // 后边有 "}",但是并不是 isDebugEnabled 的 "}" }}-------------------------------------------------------------我最后给出的这个表达式,除了判断是否有 "}" 外,还要判断这个 "}" 是否是 isDebugEnabled 的 "}",因此这个表达式在下边的代码中可以正确public class xxx{ public void xxxfun() { log.debug() // 这样会被匹配 if(isDebugEnabled()) log.debug() // 不会 if(log.isDebugEnabled()) { log.debug() // 不会 log.debug() // 不会 } log.debug(...); // 会 if(log.otherfun()) { log.debug(...) // 会 } }}-------------------------------------------另外,为了不让这个表达式过于复杂:(1) 没有考虑if(log.isDebugEnabled()){ { log.debug() // 双重括号仍然会被匹配,否则太复杂 }}(2) 没有考虑 log.debug("....{....}....") 信息中有大括号信息中有大括号的话,会影响判断。如果这些特性要求支持的话,那么这个表达式就太复杂了。 重复一次强调,我最后得到表达式为:(?<!\)\s{0,500})log\.debug(?![^{}]*(?<=isDebugEnabled\(\)\)\s{0,200}\{[^{}]{0,500})\}) 广告:我前面所写的表达式,虽然看起来复杂,其实用到的思路和方法都是一些基本的用法。看别人写的表达式就像看汇编语言似的,很不容易看清。关键是要掌握好常用的基础和理清楚思路。推荐:推荐大家访问我写的入门文章,里面讲解了我这里用到的方法:http://www.regexlab.com/zh/regref.htm 我会再开一个新帖请sswater(光杆兵)接分,顺便继续请教sswater(光杆兵)兄一些正则表达式问题! 谢谢sswater(光杆兵),你的入门文章写得真好,我会继续请教你一些问题,我会短消息给你,请留意,同时也避免倒分的嫌疑。 关于Socket通讯(阻塞方式)的奇怪现象,泪奔求帮助!! 这个异常是什么意思??求大神指教 急!急!~~~两数组排序 UPD包定位问题 域网网文件传输,急!!! 想用一段java程序对mysql数据库进行压力测试问题请教 字符串问题:关于UDP套接字的字符串发送 征集英文翻译,论坛中“帖子”应该怎么翻译? 文件的随机访问的菜鸟级问题! 怎样在两个JFrame之间传数据? 这样大包怎么不对阿。 新手求助
时,查找结果不正确,但在单文件中查找正确,不过有点慢,你那有这个问题没有?
{
log.debug("********** :");
} if (log.isDebugEnabled())
log.debug("********** :");
if (log.isDebugEnabled()) log.debug("********** :");
log.debug("********** :");//只有这句是我要查找的
//log.debug("********** :"); if (log.isDebugEnabled())
{
log.debug("ReportClientDocument initialization finished.");
log.debug("ReportHandler.initialize() End.");
}
这段例子代码中是没问题的,但是放到具体程序中好像不行。我的思路是这样的:
既然楼主要求前面不能有 "{" ,那么 log.debug 后边也不能有 "}"(但是后边可以是{}对)因此, rambostar 兄 给出的这段例子是可以的。但是放入了程序中的时候,后边不可能没有 "}",因此放入程序中不行。 rambostar 兄 的后来这个要求的确不好办,我最后给出的那个表达式也只适合 rambostar 兄 举出的例子。如果有更好的解决办法,我再继续跟贴。
(?<!\)\s{0,500})log\.debug(?![^{}]*(?<=isDebugEnabled\(\)\)\s{0,200}\{[^{}]{0,500})\})---------------------------------------------------------
说明:(?![^{]\})根据后边是否有 "}" 来决定是否要过滤掉当前的 "log.debug"。如果后边 "}" 之前还有 "{",那么这个 "log.debug" 仍然要匹配。就是说
log.debug....; // 这个 log.debug 的后边有 "}",但中间还有 "{",因此,这个是要匹配
{
log.debug...; // 这个 log.debug 不匹配,过滤掉。
}因此:"[^{]*\}" 可以,而 "[^#]*}" 不可以。------------------------------------------------------------------
我昨天所说的 "具体程序中好像不行" 是说:光凭后边是否有 "}" 来决定是不正确的。因为在具体程序中,肯定是这样的:
public class xxx
{
public void xxxfun()
{
log.debug(...); // 后边有 "}",但是并不是 isDebugEnabled 的 "}"
}
}-------------------------------------------------------------
我最后给出的这个表达式,除了判断是否有 "}" 外,还要判断这个 "}" 是否是 isDebugEnabled 的 "}",因此这个表达式在下边的代码中可以正确public class xxx
{
public void xxxfun()
{
log.debug() // 这样会被匹配 if(isDebugEnabled())
log.debug() // 不会 if(log.isDebugEnabled())
{
log.debug() // 不会
log.debug() // 不会
} log.debug(...); // 会 if(log.otherfun())
{
log.debug(...) // 会
}
}
}-------------------------------------------
另外,为了不让这个表达式过于复杂:(1) 没有考虑
if(log.isDebugEnabled())
{
{
log.debug() // 双重括号仍然会被匹配,否则太复杂
}
}(2) 没有考虑 log.debug("....{....}....") 信息中有大括号
信息中有大括号的话,会影响判断。如果这些特性要求支持的话,那么这个表达式就太复杂了。
(?<!\)\s{0,500})log\.debug(?![^{}]*(?<=isDebugEnabled\(\)\)\s{0,200}\{[^{}]{0,500})\})
http://www.regexlab.com/zh/regref.htm