Java正则表达式API详解
1. Pattern类
public class PatternExample {
/**
* public static String quote(String s)
* 返回指定字符串的字面值模式, 也就是说字符串序列中的元字符和转义序列将不具有特殊含义.
* 会使用\Q \E包裹, \Q \E中间的字符是字面意思, 不具有特殊含义.
*
* public static Pattern compile(String regex, int flag)
* 编译给定正则表达式
* flag: 匹配标志, 常用的如下解释
* CASE_INSENSITIVE: 匹配时大小写不敏感.
* MULTILINE: 启用多行模式, ^ $匹配行的开头和结尾, 而不是整个输入序列的的开头和结尾.
* UNIX_LINES: 启用UNIX换行符, 在多行模式中使用^ $时只有\n被识别成终止符.
* DOTALL: 在此模式中元字符.可以匹配任意字符, 包括换行符.
* LITERAL: 启用模式的字面值意思, 模式中的元字符、转义字符不再具有特殊含义.
*
* public static boolean matches(String regex, String s)
* 判断整个输入序列是否与给定的模式匹配.
* 底层调用Matcher实例的matchers方法
*/
@Test
public void quote() {
String regex1 = Pattern.quote(".java");
Assert.assertEquals("\\Q.java\\E", regex1);
Matcher matcher = Pattern.compile(regex1).matcher("Effect.java");
Assert.assertTrue(matcher.find());
String regex2 = Pattern.quote("\\.java");
Assert.assertEquals("\\Q\\.java\\E", regex2);
Assert.assertTrue(Pattern.compile(regex2).matcher("Effect\\.java").find());
Assert.assertFalse(Pattern.compile(regex2).matcher("Effect.java").find());
}
@Test
public void matchesVsFind() {
String s = "satat";
String regex = "at";
Assert.assertFalse(Pattern.matches(regex, s));
Assert.assertTrue(Pattern.compile(regex).matcher(s).find());
Assert.assertFalse(Pattern.compile("^at").matcher(s).find());
}
2. Matcher
public class MatcherExample {
/**
* 匹配操作
* public boolean lookingAt()
* 尝试将整个输入序列的开始处与模式匹配, 对于输入序列的结尾处不做要求
* 也就是说从左(必须是序列的开头)到右有一处与模式匹配, 便返回true.
*
* public boolean matches()
* 尝试将整个输入序列与模式匹配, 只有从头到尾完全与模式匹配才返回true.
*
* public boolean find()
* 只要整个输入序列或者子序列有一个与模式匹配, 便返回true.
* find方法可用来寻找输入序列中所有与模式匹配的子序列.
*
* 上述三个方法返回true时, 可以使用start, end, group方法获取详细信息
* 返回false时或者没有调用过匹配方法, 调用start, end, group会抛出异常"No match available"
*
* public int start()
* 返回匹配序列在输入序列中的初始索引.
* public int start(int group)
* 返回给定组捕获的匹配序列在输入序列中的初始索引, 如果给定模式匹配成功,
* 但是模式中的指定组没有匹配返回-1.
* 如果模式中没有指定的组将抛出异常IndexOutOfBoundsException: No group ${group}
*
* public int end()
* 返回匹配序列中最后一个字符在输入序列中的索引+1.
* public int end(int group)
* 返回给定组捕获的匹配序列中最后一个字符在输入序列中索引+1,
* 如果给定模式匹配成功, 但是模式中的指定组没有匹配返回-1.
* 如果模式中没有指定的组将抛出异常IndexOutOfBoundsException: No group ${group}
*
* public String group()
* 返回匹配序列
* public String group(int group)
* 返回给定组捕获的匹配序列.
* 如果给定模式匹配成功, 但是模式中的指定组没有匹配返回null.
* 如果模式中没有指定的组将抛出异常IndexOutOfBoundsException: No group ${group}
*/
@Test
public void match() {
String goal = "at sat cat mat";
String regex = ".?at(a)?";
Matcher matcher = Pattern.compile(regex).matcher(goal);
// 从开始处匹配
Assert.assertTrue(matcher.lookingAt());
Assert.assertEquals(0, matcher.start());
Assert.assertEquals(2, matcher.end());
Assert.assertEquals("at", goal.substring(matcher.start(), matcher.end()));
Assert.assertEquals("at", matcher.group());
// 组1(a)没有匹配到, 返回-1
Assert.assertEquals(-1, matcher.start(1));
Assert.assertEquals(-1, matcher.end(1));
Assert.assertNull(matcher.group(1));
}
/**
* 修改或读取当前模式匹配输入序列的范围(区域), 默认是全部区域.
* 查询时包头不包尾(subString()方法一样的含义)
*/
@Test
public void region() {
String goal = "33abcd55";
String regex = "abcd";
Matcher matcher = Pattern.compile(regex).matcher(goal);
// 查询开始索引
Assert.assertEquals(0, matcher.regionStart());
// 查询结尾索引
Assert.assertEquals(goal.length(), matcher.regionEnd());
Assert.assertFalse(matcher.matches());
matcher.reset();
// 调整区域, 相当于截取${goal}的abcd来匹配.
matcher.region(2, 6);
Assert.assertTrue(matcher.matches());
Assert.assertEquals(2, matcher.regionStart());
Assert.assertEquals(6, matcher.regionEnd());
}
@Test
public void group() {
String goal = "pig dog cat snake horse dog cat tiger monkey";
String regex = "(dog)\\s*(cat)\\s*?";
Matcher matcher = Pattern.compile(regex).matcher(goal);
// 查找所有与模式匹配的串
while (matcher.find()) {
// result: dog cat
System.out.println(matcher.group());
// result: [dog, cat]
for (int i = 1; i <= matcher.groupCount(); i++) {
if (i == 1) {
System.out.print("[" + matcher.group(i));
} else if (i == matcher.groupCount()) {
System.out.println(", " + matcher.group(i) + "]");
} else {
System.out.print(", " + matcher.group(i));
}
}
System.out.println("-----------------");
}
}
/**
* public Matcher appendReplacement(StringBuffer sb, String replacement)
* 将目标字符串与模式匹配的部分替换成replacement, 将结果放到sb中
* 此方法只会替换一处匹配的地方, 并且目标字符串的后续部分不会存放到sb中
* 其中replacement可以使用反向引用来获取捕获组的内容
* 反向引用规则(仅适用于Java):
* 1. 使用捕获组编号, $n 其中0 <= n <=groupCount()
* 2. 使用捕获组名称, ${name} name以非数字开头
* replacement只会涉及到两个字符的转义: 1. $ -> \\$ 2. \ -> \\
* 例子:
* String gaol = "I like music", regex = "like, replacement = "love";
* 那么sb = I love
*
* StringBuffer appendTail(String sb)
* 与appendReplacement搭配工作, 目标字符串剩下的内容添加到sb中
* 接着上述例子调用appendTail方法, 那么sb = I love music
*
* 基于以上两个方法便能实现replaceFirst, replaceAll两个方法
*/
@Test
public void replaceFist() {
String goal = "I like music";
String regex = "like";
String relpacement = "love";
Matcher matcher = Pattern.compile(regex).matcher(goal);
StringBuffer sb = new StringBuffer();
if (matcher.find()) {
matcher.appendReplacement(sb, relpacement);
Assert.assertEquals("I love", sb.toString());
matcher.appendTail(sb);
Assert.assertEquals("I love music", sb.toString());
}
}
/**
* 去掉dog 和 cat
*/
@Test
public void replaceAll() {
String goal = "pig dog snake cat horse dog cat tiger monkey";
String regex = "(dog\\s?)|(cat\\s?)";
Matcher matcher = Pattern.compile(regex).matcher(goal);
StringBuffer sb = new StringBuffer();
boolean flag = false;
while (matcher.find()) {
matcher.appendReplacement(sb, "");
flag = true;
}
if(flag) {
sb = matcher.appendTail(sb);
Assert.assertEquals("pig snake horse tiger monkey", sb.toString());
}
}
/**
* 去重
*/
@Test
public void removeDuplicate() {
String goal = "aabbcddeefgg";
String regex = "(\\w)\\1+";
Matcher matcher = Pattern.compile(regex).matcher(goal);
String result = matcher.replaceAll("$1");
Assert.assertEquals("abcdefg", result);
}
}
Java正则表达式API详解的更多相关文章
- java正则表达式语法详解及其使用代码实例
原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...
- Java正则表达式应用详解
如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字 ...
- Memcached Java Client API详解
针对Memcached官方网站提供的java_memcached-release_2.0.1版本进行阅读分析,Memcached Java客户端lib库主要提供的调用类是SockIOPool和MemC ...
- Java NIO API详解
在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API.对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端 ...
- 黑马程序员 Java正则表达式,详解反斜线在Java中的作用
---------------------- ASP.Net+Android+IO开发S. .Net培训.期待与您交流! ---------------------- 在程序设计过程中,经常需要对获取 ...
- Java NIO API详解(转)
原文连接: http://www.blogjava.net/19851985lili/articles/93524.html 感谢原作者 NIO API 主要集中在 java.nio 和它的 subp ...
- Java正则表达式实例详解
创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...
- Java反射api详解
虽然已经用了很多反射相关的api,但是还没有详细研究官方api文档,下面以1.6为基础研究一下api文档(因为只找到了1.6的中文版...),同时补充1.7和1.8对反射相关api的改变.
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
随机推荐
- 部署一个基于python语言的web发布环境
---恢复内容开始--- 1) 一门面向对象的语言 2)拥有丰富的库 3)可移植性 4)免费.开源 5)简单易易学 可做软件开发.人工智能.web开发等等 部署流程: Cnetos7.5+Nginx+ ...
- xcode 自动签名原理
签名的核心就是provision profile要与当前的bundle id及本地的私钥相匹配. teamid:每个开发者账号都会对应一个teamid.企业的开发这账号除了对应一个teamid外,下面 ...
- linux 的那些hung 检测机制
在dmesg中,看到如下信息: [:: seconds [:: seconds [:af: seconds [:af: seconds [:: seconds [:3b: seconds [:: se ...
- 《Spring_Four》第二次作业 基于Jsoup的大学生考试信息展示系统开题报告
一.项目概述 该项目拟采用Jsoup对大学生三大考试(考研.考公务员.考教师资格证)进行消息搜集,研发完成一款轻量级的信息展示APP,本项目主要的创新点在于可以搜集大量的考试信息,对其进行一个展示,而 ...
- 使用rpm-build制作nginx的rpm包
2014-11-27 11:05:49 一.RPM包的分类 RPM有五种基本的操作功能:安装.卸载.升级.查询和验证. linux软件包分为两大类: (1)二进制类包,包括rpm安装包(一般分为i ...
- Apache 修改端口号
默认是80端口,可在httpd.conf文件中修改以下2个地方的端口号为预定的即可,例如修改为8080端口 把httpd.conf 中Listen 80 改成Listen 8080 把ServerNa ...
- java处理url中的特殊字符%等
java处理url中的特殊字符(如&,%...) URL(Uniform Resoure Locator,统一资源定位器)是Internet中对资源进行统一定位和管理的标志.一个完整的URL包 ...
- python--第十天总结(线程、进程和协程)
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- 20175314 《Java程序设计》第二周学习总结
20175314 <Java程序设计>第二周学习总结 教材学习内容总结 我在APPstore上发现了一个可以支持我们在IOS系统上学习实践Java程序的开发环境,只需要购买专业版就可以使用 ...
- jquery判断是否是空对象 不含任何属性
code function isEmptyObject(e) { var t; for (t in e) return !1; return !0 }