从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. bundles.Add( )下无法绑定后缀为min.css的文件

    1.问题描述: 在绑定css的时候,除了后缀名为.min.css的文件,在render.style()不显示外,其他的css都正常加载, 2.解决办法: 这个是我在调试了几遍之后发现的规律,然后解决办 ...

  2. java连接VMware虚拟机Oracle数据库问题

    最近在电脑上装了虚拟机,为的是在虚拟机上安装Oracle数据库,Oracle实在太占内存,配置低的电脑装个Oracle几乎就瘫了,没办法,搞个虚拟机玩玩.我虚拟机用的是xp系统,顺便怀念下经典.装好O ...

  3. POST和GET有什么区别?

    1. GET主要用于从服务器查询数据,POST用于向服务器提交数据 2. GET通过URL传递数据,POST通过http请求体传递数据 3. GET传输数据量有限制,不能大于2kb,POST传递的数据 ...

  4. node.js入门必知

    目录: 一.node.js简介 1.1特点 1.2适合开发什么 1.3Node.js无法挑战老牌后台语言 二.http模块 一.node.js简介 Node.js开发服务器,数据.路由.本地关心的效果 ...

  5. 如何设置html中img宽高相同-css

    最近项目中有一个问题,做一个响应式的盒子,随着屏幕的变化, 宽高一直保持相等,之前一直使用js动态设置,获取盒子的宽度来设置盒子高度. 但是加载时样式显示不是很好,后来直接用css实现. html部分 ...

  6. Git 二分调试法,火速定位疑难Bug!

    你一定遇到过,一个很久没修改过的功能,莫名其妙的出现了问题?肉眼查代码.屡逻辑完全找不到问题点?前两天还好好的功能,怎么这个今天就不行了?这两天改动了这么多代码,到底是那一次改动引发的 Bug? 这样 ...

  7. 》》vue

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. libgdx3D第三讲-场景载入

    第三讲 场景载入 Loading a scene with LibGDX 网易云地址:id=442771fd5cc6ce8cf9fd30b838a76343&type=note" s ...

  9. Django的url使用方法

    利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 from django.con ...

  10. Unity 3D游戏开发引擎:最火的插件推荐

    摘要:为了帮助使用Unity引擎的开发人员制作更完美的游戏.我们精心挑选了十款相关开发插件和工具.它们是:2D Toolkit.NGUI.Playmaker.EasyTouch & EasyJ ...