`

Java正则表达式实例

    博客分类:
  • java
阅读更多
题目

    有两个文件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;
	}
}
分享到:
评论

相关推荐

    java正则表达式实例教程

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。...阅读《JAVA正则表达式实例教程.pdf》将帮助你更全面地理解和掌握Java正则表达式。

    JAVA正则表达式实例教程

    ### JAVA正则表达式实例教程知识点详述 #### 一、正则表达式的定义与特点 **1.1 正则表达式是什么?** - **定义:** 正则表达式(Regular Expression)是一种用于匹配字符串中字符组合的工具,广泛应用于搜索、...

    JAVA正则表达式实例教程.pdf

    ### JAVA正则表达式实例教程知识点详述 #### 一、正则表达式的定义与特点 **1.1 正则表达式是什么?** - 正则表达式(Regular Expression)是一种模式匹配语言,用于文本搜索和替换。它提供了一种简洁而灵活的方式...

    JAVA正则表达式实例教程.rar

    通过学习这个Java正则表达式实例教程,你将掌握如何高效地使用正则表达式进行字符串处理,提升你的Java编程能力。结合提供的PDF文档和下载说明,你可以逐步学习并实践每一个示例,巩固理论知识。同时,访问提供的...

    java正则表达式实例(邮箱,车牌,密码,url,IP,身份证,车牌等等)

    ### Java正则表达式实例详解 #### 一、概述 正则表达式是一种强大的文本处理工具,能够帮助我们在字符串中查找、替换或提取特定模式的数据。在Java编程中,正则表达式的应用非常广泛,例如在表单验证、数据清洗等...

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    JAVA正则表达式实例教程.

    JAVA正则表达式实例教程,深入解析正则表达式的应用与实践 正则表达式是计算机科学领域一种强大且灵活的文本处理工具,被广泛应用于数据验证、搜索、替换等场景。本文旨在通过实例深入讲解JAVA中正则表达式的使用...

    Java使用正则表达式提取XML节点内容的方法示例

    为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...

    JAVA正则表达式实例教程.txt

    根据给定文件的信息,我们可以深入探讨Java中的正则表达式应用与理解,这将涵盖正则表达式的概念、基本语法以及在Java环境下的具体实践。 ### 正则表达式基础知识 1. **什么是正则表达式?** 正则表达式是一种...

    java正则表达式匹配工具

    Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...

    Java正则表达式.ppt

    Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...

    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正则表达式实例教程.doc

    【JAVA正则表达式实例教程】 正则表达式在编程领域是一种强大的文本处理工具,尤其在Java中,它被广泛用于字符串的模式匹配和替换。本教程将介绍正则表达式的基本概念、常用符号以及Java中如何使用正则表达式。 1....

    java正则表达式及例子 pdf

    二、Java正则表达式实例 1. 验证邮箱格式: ```java String pattern = "^[\\w\\.-]+@([\\w\\-]+\\.)+[\\w\\-]{2,4}$"; ``` 这个模式用于检查输入的字符串是否符合电子邮件地址的基本格式。 2. 提取URL: ```...

    java 正则表达式应用jar包 regex-smart.jar

    Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...

Global site tag (gtag.js) - Google Analytics