规则思变 :: 梦想风暴

来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=157853 存档链接: https://web.archive.org/web/20040905203600id_/http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=157853


梦想风暴 一个小程序员的信口开河 <<<为了忘却的纪念 | 主页 | 初试啼声>>> 规则思变 2004-04-29 今天写了一个小工具,因为有一批数据要导。如果我勤快,我会选择手工来做,不过是几个文件里里面几十张表的几千条数据嘛!不过,我是个懒惰的程序员。 编写这个小工具的过程中,有一个有趣的小问题。 写完一段代码之后,产生数据是这个样子: 1234567=名称A1-B2 负责人对我说,我们只要前面的名称就成了。 在代码里,“名称A1-B2”存在了一个字符串中,于是我的工作变成了从这个字符串中删去后面“A1-B2”的部分。用伪码表示或许更清楚一些。 原来的是这样: target="名称A1-B2"; 我要的是这样: target="名称"; 你想到了什么? 反正我第一个打消的念头是手工删除。实际的字符串肯定不只“A1-B2”,也许还有“C3-D4”、“E5-F6”,也可能是“G7”、“H8”,总之,要删除的部分是一个由ASCII码组成的字符串。所以,解决问题的关键是识别出要删除的字符串。 识别出字符串,那么这个字符串必须满足一定条件,匹配?正则表达式? 没错,就是它。 身处Java世界是幸福的,JDK 1.4中已经加入了对正则表达式的支持,只是……,我没有用过。 JDK的API不会用?没关系, Java Almanac 是最好的答案,其中给出的例子让我可以很轻松的了解大部分JDK API的用法。它基本上已经成了我现学现卖的首选。 定义一个用来匹配的Pattern,我们要匹配一个由ASCII字符组成的串,那就这么写: Pattern pattern = Pattern.compile("(\p{ASCII})+"); 关于模式的含义,JDK的文档中写得很清楚。再说,我又不打算立即开始系统学习,只找自己需要的应该是很容易的一件事。 在文档中,匹配ASCII字符的模式是“\p{ASCII}”,因为在字符串里“\”又特殊含义,所以得多来一笔。 有了模式,我们就可以在一个字符串中查找匹配的串了。 Matcher matcher = pattern.matcher(source); 找到问题以后解决就容易多了,接下来就删了它。 我选择了替换来完成这个需求,没错,替换! 我用""替换了匹配出来的字符串,这和删除不是异曲同工吗? matcher.replaceAll(""); 大功告成! 问题是解决了,兴奋之余,我想到正则表达式,想到了Perl。 Perl在文本处理上的强大,恐怕大家多少都有些耳闻,而正则表达式正是Perl强大实力的体现。年初的时候,信手翻了一些《Perl语言入门》,因为是兴之所致,没有具体的应用方向,所以没有很好的掌握。今天遇到的这个问题,如果以Perl来解决恐怕就不必劳烦Java的大驾,毕竟这不是Java的强项。 最近在看《The Pragmatic Programmer》,第三章就谈到了一个Text Manipulation的问题。可能许多程序员和我一样,习惯以编译语言解决问题,其实很多脚本语言也很强大,尤其在处理这种小问题的时候。 我们写程序不就是为了解决问题吗?如果能够“多快好省”的解决,何乐不为? dreamhead 发表于 2004-04-29 20:17 引用Trackback(0) | 编辑 Comments 正则表达式是基本功吧?只要处理文本,这个东西是First Idea啊! 冰壶 ( ) 发表于 2004-05-08 09:33 处理一些字符串或是文本之类的用脚本语言的确是方便很多,例如我平时会用Shell和Perl btw:Eclipse下有一个关于正则表达式的Plugin,可以用来调试匹配的,RegEx Test shine ( shineless.blogone.net ) 发表于 2004-04-30 08:42 呵呵,我也正在看《The Pragmatic Programmer》。刚好也看到文本处理这一章节 风之影 ( windshadow.blogdriver.com ) 发表于 2004-05-07 13:52 发表评论 最近更新 自其不变而观之 初窥进程 叫我如何“面向接口” 自掘坟墓 复杂系统的5个属性 平民神话 我的J2EE误区 项目坚壳 重载游戏 惊天逆转