您的位置:首页 > 编程语言 > Java开发

Java正则表达式的一个实例分析

2011-10-20 13:00 465 查看

 

 

    很久没用过Java正则表达式了, 今天一个突发任务需要, 磕磕绊绊地用正则表达式完成了。现在趁热打铁地分析下这个正则表达式的写法, 并以此串起正则表达式的一些基本知识点。 

 

    问题是这样的, 需要扫描网站下所有的CSS文件,搜索出类如“url(../img/border.jpg)”这样的图片路径,对其做重命名处理。 

 

    我写的表达式是这样的,"(url\\()(\\S*/)*(\\S*\\.(gif|png))(\\))"。 

 

    直奔主题地分析下这个表达式中各部分的含义。 

 

        1, 最开头的“(”, 它跟最后的"\\("后的")"是成对的, 这是组的概念的体现。正则表达式用组可以表达更精细地切分, 可以说,整个匹配上的字符串整个是一个大组, 然后,这个大组中用括号括起来的部分是一个小组。 用这个机制,我们可以方便地直接拿出小组里的内容,而不用再把匹配到的整个字符串拿到手后,再做正则地切分。  这个思想往大的说, 跟设计模式中的Composite有些相似。 

        2, “url”,要匹配内容的开头, 用字母写出要匹配的内容是最直接的方式。 

        3, "\\("跟上面的"url"类似,不过,更进了一步, 它本它是想表达")"的,但是, 由于"()"在正则表达式里有其它的含义, 这里为了表达想匹配括号本身,就得用到转义了, Java里正则表达式的转义是用“\\”来表示的。

        4, "\\S", 感觉跟"\\("相反,“\\(”是为了表达出左括号的原意,而"\\S"是用字母S定义了一个新语意, 它表示匹配任何非空白字符。 

        5, "\\S"后面的"*", 表示匹配前面的子表达式零次或多次, 即任何非空字符可以出现多次, 这样对应着img文件的众多个父文件夹。 

        6, "/",这个没什么可说的, 跟“url”一样是本意, 在这里对应着img文件路径分隔符。

        7, “(\\S*/)”后的"*",表示“(\\S*/)”可以有多次,这样, 表达出img文件的整个父路径,如“img/a/b.gif”中的,前面部分“img/a/”。 

        8, (\\S*\\.(gif|png))整体上表示img文件的文件名, "\\."跟"\\("类似,也是表达”.“本来的意思, 重点是(gif|png), 从字面上大概能猜出来,这是表达img文件的后缀名,这里的"|"表达"或"的关系,即,可以是gif格式的图片,也可以是png格式的图片。

        9, 最后的”(\\))“不再说。 

 

 

 

  分析到这里, 又想起了, 初次接触正则表达式时的感觉, 正则表达式就像孙猴子的如意金箍棒,可以随心所欲地表达, 灵活,强大!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: