RuoShangM 2009-05-06
天气晴好,正当上午,悠闲的坐在窗边品着M记的Coffee,想起了刚才的事...
又一次用到了正则表达式,并且又一次救我于批量替换字符的危难之中。如果没有它那这次的问题估计花费的时间就多了,写好了正则表达式和替换的表达式,按一下“Replace”按钮,不到30秒解救我于烦躁的体力劳动中,感觉就两个字“舒服”。
闲话也说得差不多了,看看我的实际问题吧: 修改jsp路径问题,下面的语句是源自SpringMVC的Controller的返回,由于之前许多小盆友在Coding的时候把jsp页面的路径写死在了类中,如:
return new ModelAndView("reportBatchPrint",map);
现在需要在这个路径前添加一层report文件夹,修改后如:
return new ModelAndView("/report/reportBatchPrint",map);
正常情况下可以以
new ModelAndView\(\"(.+)\",
来搜索替换,但问题是目前有些已经添加了report路径,所以就需要修改为
new ModelAndView\(\"([^\/])\",
即不包含“/”字符的任意字符,但又发现还有
return new ModelAndView("redirect:report.do",map);
这种重定向的语句存在所以修改为
new ModelAndView\(\"([^:\/])\",
即不包含“/”和“:”字符的分组,搜索了一下发现一个都没匹配到,忽然想起需要添加匹配次数,于是修改为
new ModelAndView\(\"([^:\/]+)\",
发现搜索范围过大了把其他行的代码都加进来了,于是想到正则表达式的贪婪与懒惰问题,查阅资料后发现须以“+?”来限定,即“重复1次或更多次,但尽可能少重复”,会心的一笑,修改为
new ModelAndView\(\"([^:\/]+?)\",
搜索到了想要的东西,然后用
new ModelAndView\(\"/report/\1\",
来替换问题迎刃而解,其中\1代表()内组一的内容。
下面提供一些相关概念、资源及链接地址:
正则表达式(英文:Regular Expression),在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。
表5.懒惰限定符
代码/语法 | 说明 |
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
正则表达式30分钟入门教程
http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#regexoptions
=================================================
images/loading.gif
((images/)((?!report/)[^"')>]+))*
\2report/\3
=================================================
scripts/ext-2.0/resources/css/report/common.css
scripts/ext-2.0/source/locale/ext-lang-zh_CN.js((scripts/)((?!report/)[^"')>]+))*
\2report/\3
=================================================
css/credit/listcss/dgcStyle.css
scripts/report/ext-2.0/resources/css/ext-all.css (css/ext-all.css)(("css/)((?!report/)[^"')>]+))*
\2report/\3
=================================================
"styles/css.css(("styles/)((?!report/)[^"')>]+))*
\2report/\3
=================================================