- 浏览: 1237387 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
题目:
有两个文件context.txt和words.conf,请尝试将他们合并成为一段文字,并打印出来。
文件内容:
context.txt
“并不是每个人都需要$(qunar)自己的粮食,$(flight.1)每个人都需要做自己穿的$(flight.2),我们说着别人发明的$(hotel),使用别人发明的数学......我们一直在$(tuan)别人的成果。使用人类的已有经验和知识$(travel.1)来进行,是一件$(travel.2)的事情”
words.conf
flight=也不是:衣服
qunar=种植
hotel=语言
tuan=使用
travel=发明创造:很了不起
分析
context.txt包含占位符(键)的文本,words.conf为键和值的映射,需要将占位符(键)替换为实际值。
context.txt
占位符都是以$开头,一对圆括号包围,$和()在正则表达式里有特殊含义,需要用反斜杠转义;里面的键虽然不同,但都是字符串(.序号)形式,可以使用\\w+(.\\d+)?
words.conf
值用冒号分开的,需要作为多个键值对处理,如flight=也不是:衣服,需要解析成flight.1=也不是,flight.2=衣服
方案
java.util.regex.Pattern
调用Pattern的compile方法,传入匹配占位符的正则表达式,返回一个Pattern实例。
java.util.regex.Matcher
调用Pattern实例的matcher方法,传入需要匹配的文本,返回Matcher实例。
接着就可以使用find()遍历所有匹配项,group()返回每个匹配文本,appendReplacement()追加从上一个匹配后开始,到该匹配之间的文本,并替换当前匹配部分,appendTrail()追加从最后一个匹配后开始,到文本结束之间的内容。
代码
有两个文件context.txt和words.conf,请尝试将他们合并成为一段文字,并打印出来。
文件内容:
context.txt
“并不是每个人都需要$(qunar)自己的粮食,$(flight.1)每个人都需要做自己穿的$(flight.2),我们说着别人发明的$(hotel),使用别人发明的数学......我们一直在$(tuan)别人的成果。使用人类的已有经验和知识$(travel.1)来进行,是一件$(travel.2)的事情”
words.conf
flight=也不是:衣服
qunar=种植
hotel=语言
tuan=使用
travel=发明创造:很了不起
分析
context.txt包含占位符(键)的文本,words.conf为键和值的映射,需要将占位符(键)替换为实际值。
context.txt
占位符都是以$开头,一对圆括号包围,$和()在正则表达式里有特殊含义,需要用反斜杠转义;里面的键虽然不同,但都是字符串(.序号)形式,可以使用\\w+(.\\d+)?
words.conf
值用冒号分开的,需要作为多个键值对处理,如flight=也不是:衣服,需要解析成flight.1=也不是,flight.2=衣服
方案
java.util.regex.Pattern
调用Pattern的compile方法,传入匹配占位符的正则表达式,返回一个Pattern实例。
java.util.regex.Matcher
调用Pattern实例的matcher方法,传入需要匹配的文本,返回Matcher实例。
接着就可以使用find()遍历所有匹配项,group()返回每个匹配文本,appendReplacement()追加从上一个匹配后开始,到该匹配之间的文本,并替换当前匹配部分,appendTrail()追加从最后一个匹配后开始,到文本结束之间的内容。
代码
public class CombineTwoFiles { public static void main(String[] args) throws IOException { Map<String, String> words = fetchWords(); // 读取键值对 Pattern p = Pattern.compile("\\$\\((\\w+(.\\d)?)\\)"); // 匹配$(qunar)或$(flight.1) try (BufferedReader reader = new BufferedReader(new InputStreamReader( CombineTwoFiles.class.getResourceAsStream("context.txt")))) { // JDK7自动资源管理 StringBuffer sb = new StringBuffer(); String line = reader.readLine(); while (line != null) { Matcher m = p.matcher(line); while (m.find()) { // 遍历匹配项 String anchor = m.group(1); // group(0)返回整个文本,group(1)返回匹配正则表达式的文本,如果表达式中有括号,返回匹配第一对括号之间表达式的文本 String value = words.get(anchor); //获取键对应的值 if (value == null) { // 值不存在 value = ""; // 赋值为空字符串,防止出现空指针异常 } m.appendReplacement(sb, value); // 往sb追加自上个匹配后到此次匹配的文本,并将匹配项替换为对应值的文本 } m.appendTail(sb); // 往sb追加自最后一个匹配后至末尾的文本 line = reader.readLine(); } System.out.println(sb.toString()); } catch (Throwable t) { t.printStackTrace(); } } private static Map<String, String> fetchWords() throws IOException { BufferedReader reader = null; Map<String, String> words = new HashMap<String, String>(); try { reader = new BufferedReader(new InputStreamReader(CombineTwoFiles.class.getResourceAsStream("word.conf"))); String line = reader.readLine(); while (line != null) { String[] kv = line.split("="); if (kv.length == 2) { String[] vals = kv[1].split(":"); if (vals.length > 1) { // 多个值 int i = 1; for (String val : vals) { // 构造形如flight.1的键 words.put(kv[0].concat(".").concat(String.valueOf(i++)), val); } } else { // 单个值 words.put(kv[0], kv[1]); } } line = reader.readLine(); } } finally { // JDK7之前版本,释放资源的方式 if (reader != null) { reader.close(); } } return words; } }
发表评论
-
Netty系列之二、Netty组件
2014-10-12 19:55 0Netty主要由以下几个组件构成: Bootstrap o ... -
Netty系列之二:传输方式
2014-09-17 22:35 0NIO (Non-blocking I/O) io.netty ... -
quartz系列之九:存储
2014-08-05 13:16 0这里以1.8.x为例: 任务 ... -
JVM 四种引用
2014-04-24 19:56 17181. 强引用 指通过普通 ... -
Proxy 源码分析
2014-04-21 10:47 0public class Proxy implements ... -
NIO UDP 编程
2014-04-17 23:18 4206和TCP的SocketChannel类似,UDP的Dat ... -
Matcher 源码分析
2014-04-15 14:45 0首先看下接口: public interface Matc ... -
BTrace 使用
2014-03-20 18:03 0简介 Btrace (Byte Trace)是Sun推出的一款 ... -
NIO Socket 编程
2014-04-11 22:48 1603Java NIO (Nonblocking IO)解决了常规I ... -
hessian系列之二:上传文件
2014-02-17 17:16 6155hessian较早版本通过 byte[] 进行文件传输;4.0 ... -
hessian系列之三:与Spring集成
2014-02-17 20:21 17813Spring封装了hessian客户端和服务端的通用代码,把实 ... -
hessian系列之一:Hello world
2014-01-06 20:51 2255Hessian是一个Web Service的轻量级二进制协议, ... -
XStream:自定义转换器
2013-12-30 22:47 0XStream是一款不错的oxm (Object-XML ma ... -
Http连接工具类
2013-12-28 16:13 0public class HttpConnUtil { ... -
Integer源码分析
2013-12-26 19:59 0private static String toU ... -
全排序
2013-12-23 21:02 0写一个函数, 如 foo(String str), 打印出 s ... -
logback系列之四:输出日志到不同文件
2013-12-03 16:25 68755logback系列之一:输出日志到控制台 logback系列之 ... -
Properties 源码分析
2013-11-26 10:32 01. Properties类扩展了Hashtable,用来保存 ... -
logback系列之三:输出日志到文件(滚动)
2013-11-16 23:37 64271logback系列之一:输出日志到控制台 logback系列之 ... -
logback系列之二:输出日志到文件
2013-11-15 15:20 30238logback系列之一:输出日志到控制台 logback系列之 ...
相关推荐
JAVA正则表达式实例教程 欢迎下载
java正则表达式实例教程,为方便java程序员的开发使用
JAVA正则表达式实例教程.pdfJAVA正则表达式实例教程.pdf
JAVA正则表达式实例教程.txt
正则表达式到底是什么东西? 字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则...
正则表达式 实例
JAVA正则表达式实例教程
/** * 匹配的例子: * (GC_F_BA_ACD_FDALFD_I_FALDJF) * (GC_F_BA_ACD_FDALFD) * (GC_F_BA_ACD)等 * * 解释 * \\( \\)表示:前后的一对小括号 * * [A-Z]+(\\_[A-Z]+)* * [A-Z]+ 1个或多个大写字母 ...
JAVA正则表达式实例教程 JAVA正则表达式实例教程
JAVA正则表达式实例教程.
JAVA正则表达式实例教程 共17页.docx
对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,《正则表达式经典实例》给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。...
JAVA正则表达式实例教程.doc