K:java中正则表达式的使用说明及其举例
从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中正则表达式的使用说明及其举例的更多相关文章
- Java中正则表达式的使用(常用的方法)
这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...
- java中正则表达式基本用法
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java中正则表达式去除html标签
Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...
- JAVA中正则表达式常用的四个方法
JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...
- java中正则表达式基本用法(转)
https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...
- JAVA中正则表达式学习总结
一.JAVA中正则表达式相关的类 1. java.util.regex.Pattern 该类用于编译模式,模式可以理解为一个正则表达式,比如:a*b. 用法如下: // 创建模式 Pattern p ...
- Java中正则表达式、模式匹配与信息抽取
引言 记得几年前在做网页爬虫后的信息抽取时,针对网页源码中隐藏的要提取的信息,比如评论.用户信息等属性信息,直接利用HtmlParser得到.如此做倒是简单,不过利用的是网页的规范的tag标记.其实j ...
- Java中正则表达式的使用
public class Test{ public static void main(String args[]) { String str="@Shang Hai Hong Qiao Fe ...
随机推荐
- 用swoole和websocket开发简单聊天室
首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中.第二,代码中一定要有日志记录和完善的报错并记录报错.言归正传,swoole应该是每个phper必须要了解的, ...
- TeamTalk安装测试
TeamTalk介绍 项目框架 TeamTalk是蘑菇街的开源项目,github维护的最后时间是2015但是仍然是一款值得学习的好项目,麻雀虽小五脏俱全,本项目涉及到多个平台.多种语言,简单关系如下图 ...
- codeforces 897B Chtholly's request 偶数长度回文数
codeforces 897B Chtholly's request 题目链接: http://codeforces.com/problemset/problem/897/B 思路: 暴力求出这100 ...
- Vue单页面骨架屏实践
github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...
- 将项目打包成jar,如何又将jar还原成项目
一.将项目打包成jar 第一步: 选择项目,鼠标右键,选择export ,出现如下 接下来就是点击Next,Next,最后点击Finish 后 会生成jar 二.将jar还原成项目 第一步 用反编译工 ...
- spring 4 升级踩雷指南
spring 4 升级踩雷指南 前言 最近,一直在为公司老项目做核心库升级工作.本来只是想升级一下 JDK8 ,却因为兼容性问题而不得不升级一些其他的库,而其他库本身依赖的一些库可能也要同步升级.这是 ...
- Codeforces 869C The Intriguing Obsession
题意:有三种颜色的岛屿各a,b,c座,你可以在上面建桥.联通的点必须满足以下条件:1.颜色不同.2.颜色相同且联通的两个点之间的最短路径为3 其实之用考虑两种颜色的即可,状态转移方程也不难推出:F[i ...
- Java二分法
public class Dichotomy { //定义查找次数 static int count = 0; public static void main(Str ...
- Loadrunner 中时间戳函数 web_save_timestamp_param(时间返回数值)
web_save_timestamp_param("tStamp", LAST); lr_output_message("Moon1:%s",lr_eval_s ...
- 版本号控制-GitHub
前面几篇文章.我们介绍了Git的基本使用方法及Gitserver的搭建.本篇文章来学习一下怎样使用GitHub. GitHub是开源的代码库以及版本号控制库,是眼下使用网络上使用最为广泛的服务,Git ...