从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. 在centOS上搭建wordpress博客系统

    一.主要内容 1.安装LAMP服务器系统(Linux.Apache.MySQL.PHP ); 2.安装wordpress: 二.具体步骤 一.LAMP环境设置 1.安装LAMP系统,在centOS上可 ...

  2. Python函数篇(5)-装饰器及实例讲解

    1.装饰器的概念   装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式   装饰器可以简单的理 ...

  3. redmine工作流程总结

    1.需求调研员和測试员新建问题,问题跟踪为支持,指派给产品经理 2.产品经理对收到的问题进行分类处理,功能类型的,改动跟踪状态为功能,指派给自己.是bug类型的,将跟踪类型改动错误类型,指派给技术经理 ...

  4. 在无人值守程序(服务)中调用Microsoft Graph

    作者:陈希章 发表于 2017年5月31日 什么是无人值守程序(服务) 我在此前用了几篇文章分别介绍了在桌面应用程序(控制台),Web应用程序(ASP.NET MVC),以及PowerSehll脚本中 ...

  5. 转:java泛型

    1.为什么需要泛型 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52230032 泛型在Java中有很重要的地位,网上很多文章罗列各 ...

  6. IntelliJ Idea 2017 注册码 免费激活方法

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.弹窗中选择最后一个页面license server,填入下面一种链接即可: http://idea.iteblog.co ...

  7. android 程序执行linux命令注意事项

    一:问题描述    在已经root过的android设备下,app执行一个linux命令,app需要获取su权限,在某些android主板下会出现异常, Command: [su] Working D ...

  8. Activiti 6.0 之SkipExpression

    Activiti 6.0 之SkipExpression 惭愧惭愧,这么一个小小的功能整了这么久. ​ 还是先说一下业务场景吧.在工作流中,我们难免会遇到这样的情况,即一个流程的发起者的身份问题.举个 ...

  9. 腾讯WeTest《2017中国移动游戏质量白皮书》开放预约,再为国内手游把把脉

    产品为王,质量先行.如果说2016年是爆款手游相继崛起的一年,那么2017年则更像是打磨精品.建立生态的高手切磋之年.守住一个游戏的质量生命线,方能建立健康生态,方能在如火如荼的行业竞争中角逐到最后. ...

  10. 《调试九法——软硬件错误的排查之道》【PDF】下载

    <调试九法--软硬件错误的排查之道>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196352 内容简介 <调试九法:软硬件错 ...