从Java1.4起,java核心API就引入了java.util.regex程序包来处理正则表达式,并使用该包下的相关类进行字符串的匹配、搜索、提取、分析结构化内容等工作。需要注意的是,正则表达式本身也是一个字符串,为此,只有经过正确编译之后的正则表达式才能用于其它字符串的匹配等工作。经过正确编译后的正则表达式将其称之为“模式”

java.util.regex类库主要包含了两个类:Pattern以及Matcher。

Pattern用于编译一个正则表达式并用于表示正则表达式经编译后的表现形式。由于java字符串是基于统一字符编码(Unicode)的,为此,正则表达式也适用于国际化的应用程序。

Matcher用于匹配字符序列与给定模式。

注意点:

Pattern是不可变的对象,是线程安全的,而Matcher是线程不安全的

Pattern类相关说明:

相关字段:

字段 说明
static int CANON_EQ 启用规范等价
static int CASE_INSENSITIVE 启用不区分大小写的匹配
static int COMMENTS 模式中允许空白和注释
static int DOTALL 启用dotall模式
static int LITERAL 启用模式的字面值解析
static int MULTILINE 启用多行模式
static int UNICODE_CASE 启用Unicode感知的大小写折叠
static int UNIX_LINES 启用Unix行模式

常用方法:

方法 相关说明
static Pattern compile(String regex) 将给定的正则表达式编译到模式中
static Pattern compile(String regex,int flags) 将给定的正则表达式编译到具有给定标志的模式中
(Pattern.CASE_INSENSITIVE 表示不区分大小写)
int flags() 返回此模式的匹配标识,其为Pattern类的相关字段的值
Matcher match(CharSequence input) 获取匹配器,input是输入的待处理的字符串
static boolean matches(String regex, CharSequence input) 快速的匹配调用,直接根据输入的正则表达式regex匹配字符序列input
String[] split(CharSequence input,int limit) 围绕此模式的匹配,分隔字符序列input,limit参数可以限制分隔的次数
String pattern() 返回在其中编译过此模式的正则表达式。
String toString() 返回此模式的字符串表示
  • 需要注意的是当调用Pattern实例的match(CharSequence input)方法返回一个匹配器Matcher实例的时候,其并未将字符串与本Pattern实例所代表的模式进行匹配。

    通过Pattern类调用matches(String regex,CharSequence inpit)静态方法的时候,其执行了模式的匹配,根据输入的正则表达式去匹配输入的字符序列,当字符序列符合所输入的正则表达式所表示的模式的时候,其返回true,否则返回false

    使用match(CharSequence input)和matches(String regex,CharSequence input)方法的主要区别在于match方法返回了一个Matcher对象,可以用来根据给定的模式去做更多的处理(例如根据给定的字符序列的位置进行匹配)。而matches方法只是简单的去用给定的正则表达式所表示的模式去匹配了整个输入的字符序列并返回匹配的结果。

Matcher类相关说明:

常用方法:

方法 相关说明
boolean matches() 对整个输入字符串进行模式匹配
boolean lookingAt() 对输入字符串的开始处进行模式匹配。当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。
boolean find(int start) 从start处开始匹配模式
boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。
int grounpCount() 返回匹配后的分组数目
String replaceAll(String replacement) 用给定的replacement全部替代匹配的部份
String replaceFitrst(String replacement) 用给定的replacement替代第一次匹配的部份
Matcher appendReplacement(StringBuffer sb,String replacement) 根据模式用replacement替换相应的内容,并将匹配的结果添加到sb当前位置之后,其主要结合find()方法相互使用
StringBuffer appendTail(StringBuffer sb) 将输入序列中匹配之后的末尾字串添加到sb当前位置之后.
String group(int group) 返回在以前匹配操作期间由给定组(即group参数的值)捕获的输入子序列。
  • 以下部份用于演示相关实例

示例一:

String sb="java.*";
System.out.println(Pattern.matches(sb,"java"));
System.out.println(Pattern.matches(sb,"javas")); ps: Pattern类的matches静态方法用于比较一个String是否匹配一个给定的模式。正则“java.*”表示用于匹配以“java”字符为前缀的字符串

示例二:

String[] dataArr = { "1", "10", "101", "1010", "100+" };
for (String str : dataArr)
{
String patternStr = "\\d+";
boolean result = Pattern.matches(patternStr, str);
if (result)
{
System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
}
else
{
System.out.println("字符串" + str + "匹配模式" + patternStr + "失败");
}
} ps:\\d表示的是匹配数字,(因为在java中\为转义字符,为此需要写成\\表示正则表达式的一个\字符)而+表示一次或多次,所以模式\\d+就表示一位或多位数字.
因此前四个能匹配上,最后一个因为+号是非数字字符而匹配不上.

示例三:

String str = "薪水,职位 姓名;年龄 性别";
String[] dataArr = str.split("[,\\s;]");
for (String strTmp : dataArr)
{
System.out.println(strTmp);
} ps:String类的split函数支持正则表达式,上例中模式能匹配”,”,单个空格,”;”中的一个,split函数能把它们中任意一个当作分隔符,将一个字符串劈分成字符串数组.

示例四:

String sb="boo:and:foo";
Pattern pattern=Pattern.compile("o");
String[] string=pattern.split(sb);
System.out.println(string.length);
for(String s:string)
{
System.out.println(s);
} ps:需要注意该方法和String类的split方法使用上的区别

示例五:

String str="10元 1000人民币 10000元 100000RMB";
str=str.replaceAll("(\\d+)(元|人民币|RMB)", "$1¥");
System.out.println(str); ps:上例中,模式“(\\d+)(元|人民币|RMB)”按括号分成了两组,第一组\\d+匹配单个或多个数字,第二组匹配元,人民币,RMB中的任意一个,替换部分$1表示第一个组匹配的部分不变,其余组替换成¥,需要注意和正则表达式中的\1即回溯引用相互区分开来。 替换后的str为10¥ 1000¥ 10000¥ 100000¥

示例六:

//Pattern.CASE_INSENSITIVE表示忽略大小写
Pattern p = Pattern.compile("m(o+)n", Pattern.CASE_INSENSITIVE);
// 用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
StringBuffer sb = new StringBuffer();
// 使用循环找出模式匹配的内容替换之,再将内容加到sb里
while (m.find())
{
m.appendReplacement(sb, "moon");
}
// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
System.out.println("替换后内容是" + sb.toString()); ps:运行的结果是:替换后内容是moon moon moon moon moon

实例七:

String regex="<(\\w+)>(\\w+)</\\1>";
Pattern pattern=Pattern.compile(regex);
String input="<name>Bill</name><salary>50000</salary><title>GM</title>";
Matcher matcher=pattern.matcher(input);
while(matcher.find())
{
System.out.println(matcher.group(2));
} ps:\\1对应第一个小括号括起来的(\\w+).其为回溯引用。
matcher.group(2)用于表示得到的匹配的字符串的第二个子表达式的内容

实例八:

//此处的正则表达式使用()将整个表达式括起来是为了便于下面使用find和group方法获取各个匹配的结果
String regex="([a-zA-Z]+[0-9]+)";
Pattern pattern=Pattern.compile(regex);
String input="age45 salary500000 50000 title";
Matcher matcher=pattern.matcher(input);
StringBuffer sb=new StringBuffer();
while(matcher.find())
{
String replacement=matcher.group(1).toUpperCase();
matcher.appendReplacement(sb, replacement);
}
matcher.appendTail(sb);
System.out.println("替换完的字串为"+sb.toString()); ps:运行结果:替换完的字串为AGE45 SALARY500000 50000 title

回到目录|·(工)·)

K:java中正则表达式的使用说明及其举例的更多相关文章

  1. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  2. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  3. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  4. Java中正则表达式去除html标签

    Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...

  5. JAVA中正则表达式常用的四个方法

    JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...

  6. java中正则表达式基本用法(转)

    https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...

  7. JAVA中正则表达式学习总结

    一.JAVA中正则表达式相关的类 1. java.util.regex.Pattern 该类用于编译模式,模式可以理解为一个正则表达式,比如:a*b. 用法如下: // 创建模式 Pattern p ...

  8. Java中正则表达式、模式匹配与信息抽取

    引言 记得几年前在做网页爬虫后的信息抽取时,针对网页源码中隐藏的要提取的信息,比如评论.用户信息等属性信息,直接利用HtmlParser得到.如此做倒是简单,不过利用的是网页的规范的tag标记.其实j ...

  9. Java中正则表达式的使用

    public class Test{ public static void main(String args[]) { String str="@Shang Hai Hong Qiao Fe ...

随机推荐

  1. 用shape画内圆外方,形成一个圆形头像

    很多人都有过这样的经历,想要在自己写的程序里,上传一张随便大小形状的照片在程序里显示都是圆形照片,或者是方形,或者是三角形,但是写代码又非常麻烦,这里就有一个也可以实现一样效果的方法,那就是用 lay ...

  2. 前端测试框架Jest系列教程 -- Mock Functions

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  3. 可以在手机上看电脑本地html步骤,我自己总结的哦!

    1.打开控制面板 2.打开程序和功能 3.打开或关闭功能 4.internet信息服务展开后里面所有的都要选中 5.回到桌面,然后右键计算机,选择'管理' 6.先在E盘或者D盘创建一个文件夹,自己随意 ...

  4. python通过webservice接口实现配置下发

    项目上要开发一个小工具,通过webservice接口实现配置下发,考虑到python的第三方库对soap的良好支持,果断决定用python来完成这一使命. Python的支持webservice的第三 ...

  5. Golang 探索对Goroutine的控制方法

    前言 在golang中,只需要在函数调用前加上关键字go即可创建一个并发任务单元,而这个新建的任务会被放入队列中,等待调度器安排.相比系统的MB级别线程栈,goroutine的自定义栈只有2KB,这使 ...

  6. java学习笔记之字符流文件复制

    字符文件复制 FileReader fr =new FileReader("b.txt");//绑定源文件 FileWriter fw= new FileWriter(" ...

  7. java学习笔记之System类

    System类常用总结 System类概述 java.lang.System类,系统属性信息工具类 常用静态方法: 1. public static long currentTimeMillis() ...

  8. JAVA基础-----Maven项目的搭建

    Maven项目的搭建 一.前言 maven官网:http://maven.apache.org/, 文章简介:本文章从三个模块来了解Maven,分别是 Maven的基本概念~, Maven项目的安装和 ...

  9. 自己定义View Controller转换动画

    原文链接 : Introduction to Custom View Controller Transitions and Animations 原文作者 : joyce echessa 译文出自 : ...

  10. string.prototype.replace 和正则表达式

    字符串的replace方法是操作字符串的常用方法之一,但这个方法只有当与正则合并使用时,才能体现出它的强大之处. 语法:str.replace(regexp|substr, newsubStr|fun ...