Java中的正则表达式类
________________________________________
public interface MatchResult
匹配操作的结果。
此接口包含用于确定与正则表达式匹配结果的查询方法。通过 MatchResult 可以查看匹配边界、组和组边界,但是不能修改
________________________________________
public final class Matcher
extends Object
implements MatchResult
通过解释 Pattern 对 字符序列 执行匹配操作的引擎。
通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
• matches 方法尝试将整个输入序列与该模式匹配。
• lookingAt 尝试将输入序列从头开始与该模式匹配。
• find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
________________________________________
public final class Pattern
extends Object
implements Serializable
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。
测试类:表情转换
package com.yqm;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

enum Dev {
MOBILE, WEB
}

public class Emotions {
/**
* 移动端表情字符串数组
*/
private static String[] mobile = { "[/微笑]", "[/瘪嘴]", "[/好色]", "[/瞪眼]",
"[/得意]", "[/流泪]", "[/害羞]", "[/闭嘴]", "[/睡觉]", "[/大哭]", "[/尴尬]",
"[/愤怒]", "[/调皮]", "[/呲牙]", "[/惊讶]", "[/难过]", "[/装酷]", "[/冷汗]",
"[/抓狂]", "[/呕吐]", "[/偷笑]", "[/可爱]", "[/白眼]", "[/傲慢]", "[/饥饿]",
"[/困]", "[/恐惧]", "[/流汗]", "[/憨笑]", "[/大兵]", "[/奋斗]", "[/咒骂]",
"[/疑问]", "[/嘘嘘]", "[/晕]", "[/折磨]", "[/衰]", "[/骷髅]", "[/敲打]",
"[/再见]" };
/**
* 网页端表情前缀
*/
private static String prefix = "<img src='/pathToEmoticons/";
/**
* 网页端表情后缀
*/
private static String end = ".gif'>";

private static Map<String, String> mobileToWebEmotions = new HashMap<String, String>();
private static Map<String, String> webToMobileEmotions = new HashMap<String, String>();

static {
for (int i = 0; i < mobile.length; i++) {
mobileToWebEmotions.put(mobile[i], prefix + i + end);
webToMobileEmotions.put(prefix + i + end, mobile[i]);
}
}

/**
* 表情转换
*
* @param message
* @param isToMobile
* true 为转成手机端表情 false为转为网页端表情
* @return
*/
private static String formatEmotion(String message, Dev dev) {
String regex = null;
Pattern pattern = null;
Matcher matcher = null;
StringBuffer buffer = new StringBuffer();
if (dev == Dev.WEB) {
regex = "\\[\\/[\u4E00-\u9FA5]*\\]";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(message);
while (matcher.find()) {
matcher.appendReplacement(buffer,
//matcher.group()匹配到的字串,如[/憨笑]
mobileToWebEmotions.get(matcher.group()));
}
} else {
regex = prefix + "[0-9]+" + end;
pattern = Pattern.compile(regex);
matcher = pattern.matcher(message);
while (matcher.find()) {
matcher.appendReplacement(buffer,
webToMobileEmotions.get(matcher.group()));
}
}
matcher.appendTail(buffer);
return buffer.toString();
}

/**
* @param args
*/
public static void main(String[] args) {
String msg = "[/微笑]Hello[/憨笑]";
System.out.println(Emotions.formatEmotion(msg, Dev.WEB));
}

} /* Output:
<img src='/pathToEmoticons/0.gif'>Hello<img src='/pathToEmoticons/28.gif'>
*/// :~

扩展:
Matcher 类同时提供了四个将匹配子串替换成指定字符串的方法:
1、 replaceAll()
2、 replaceFirst()
3、 appendReplacement()
4、 appendTail()
replaceAll() 与 replaceFirst() 的用法都比较简单,请看上面方法的解释。我们主要重点了解一下 appendReplacement() 和 appendTail() 方法。
appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里,而 appendTail(StringBuffer sb) 方法则将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。
例如,有字符串 fatcatfatcatfat, 假设既有正则表达式模式为"cat",第一次匹配后调用 appendReplacement(sb,"dog"), 那么这时 StringBuffer sb 的内容为 fatdog,也就是 fatcat 中的 cat 被替换为 dog 并且与匹配子串前的内容加到 sb 里,而第二次匹配后调用 appendReplacement(sb,"dog"),那么 sb 的内容就变为 fatdogfatdog,如果最后再调用一次 appendTail(sb), 那么 sb 最终的内容将是 fatdogfatdogfat。

java中的正则表达式类---表情转换实例相关推荐

  1. 详解Java中的正则表达式

    详解Java中的正则表达式,并列出常用的正则表达式语法和一些常用的场景. 判断一个字符串是否是由数字组成: 当不使用正则表达式的时候的实现代码: public class RegexDemo01 {p ...

  2. JAVA基础(12.Java中的常用类String)

    目录 1.前言 2.日期(时间)相关类 2.1 日期类的应用场景 2.1.1Java中的日期相关的几个类 3. Java中的常用类学习方式 3.1 什么是常用类?为什么要学习? 3.2 怎么使用Jav ...

  3. java method field_java_解析Java中的Field类和Method类,Field类 Field类中定义了一些方 - phpStudy...

    解析Java中的Field类和Method类 Field类Field类中定义了一些方法,可以用来查询字段的类型以及设置或读取字段的值.将这些方法与继承而来的member方法结合在一起.就可以使我们能够 ...

  4. Java中的Object类和Class类

    Copyright©Stonee 在Java中,无论是类还是接口,它们在JVM的内存逻辑模型中都会存在Super和Class指针,分别指向根类(Object类)和反射类(Class类) 在这一篇blo ...

  5. Java中的File类和IO流

    Java中的File类和IO流 File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. File的分隔符 import java.io.Fi ...

  6. 【JavaSE】java中的正则表达式(从0到1学会正则表达式)

    文章目录 前言 一.正则表达式的三个常用类 1.Pattern类 2.Matcher类 3.PatternSyntaxException类 二.正则表达式的底层实现 1.Matcher.find()和 ...

  7. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  8. Java中常用的类及其特点

    Java中的内部类有四种(内部类作用1.封装装类型. 2.直接访问外部类成员. 3.回调.)内部类,方便他们的外部类调用,一般不会被其它类使用,比如事件监听器之类的,外部类刚好继承了一个别的类,如果你 ...

  9. Java 中的 BigDecimal 类你了解多少?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:什么?你还在使用fastjson,性能太差了个人原创+1博客:点击前往,查看更多 作者:HikariCP 链接: ...

最新文章

  1. 前端资源预加载并展示进度条
  2. 利用JavaScript写猜数字小游戏
  3. springmvc:405 request method post not supported
  4. python爬取岗位数据并分析_Python年薪最高有50w|探秘全国近1600个Python岗位数据分析...
  5. Directx11教程(60) tessellation学习(2)
  6. java爬虫微信公众号信息_微信公众号爬虫项目(reptile)
  7. 最新凌风云支付系统网站源码全解无后门V4.1.1版本
  8. http权威指南(一)-Http概述
  9. GoF设计模式——工厂模式(C++实现)
  10. mysql 实现字符串的拼接
  11. cad计算机快捷键设置,2014年CAD计算机快捷键
  12. 如何修复苹果Mac中的快速视频播放错误
  13. 209最新100个面试问题大全及答案
  14. 940mx黑苹果驱动_【必看】黑苹果安装显卡支持列表
  15. vue 高德地图 不同区域显示不同颜色_高德地图这样用成为你的图表神器
  16. Android音频播放
  17. c语言中的下标变量是什么,c语言引用数组元素时其数组下标的允许的数据类型是什么...
  18. 机械专业转嵌入式软件经历
  19. tanh () 函数
  20. 公司内部邮箱服务器发送邮件 java版

热门文章

  1. 网站空间是跟服务器在一起吗,网站空间是服务器吗
  2. 新能源碰撞大数据,回顾和永洪的第一次故事
  3. linux 解压rar
  4. 删除了Main.storyboard后,实现代码写的ViewController和用storyboard实现的viewController的跳转
  5. 基于OCR的图片字符识别可行性研究
  6. Python 斑点检测 SimpleBlobDetector
  7. GetMessage TranslateMessage DispatchMessage 和PeekMessage
  8. 奥运测手速小游戏(傅女神)
  9. 2021年湖北个人怎么考安全员证也就是安全员C1C2C3证
  10. 【互联网电视】互联网电视打响“客厅争夺战”