Java Pattern Matcher 正则应用
转自:http://www.itzhai.com/java-notes-regex-matches-and-lookingat.html#read-more
- 正则表达式最基本的语法;
- String内建的正则表达式功能,常用方法:split(), replaceFirst(), replaceAll();
- 使用Java创建正则表达式,相关类:Pattern, Matcher, Group;
- Pattern标记的介绍,使用Pattern.complie(String regex, int flag)给正则表达式指定模式;
- Pattern中的split方法,与String中的split类似;
- Matcher的替换操作,常用方法:replaceAll(String replacement), replaceFirst(String replacement), appendReplacement(StringBuffer sb, String replacement) , appendTail(StringBuffer sb);
- Matcher中reset()方法的使用;
- 在JAVA I/O中使用正则表达式。
很久以前,正则表达式就整合到了Unix工具集中,例如sed和awk,也整合到了Python和Perl之类的程序设计语言中。Java中的字符串操作还主要集中在String,StringBuffer和StringTokenizer类,提供的功能相比于正则表达式简单有限。
关于Java中的正则表达式详细的语法,可以参考JDK文档。
\\d 表示一位数字
\\\\ 表示普通的反斜线
\n\t 表示换行和制表符,只需要使用单反斜线
-?\\d+ 表示可能有一个负号,后面跟着一位或多位数字
String str ="-123";
boolean isNum = str.matches("(-|\\+)?\\d+");// 可能包含负号或者正号的整数
System.out.println(isNum);// output: true
这是String中提供的一个非常有用的正则表达式工具,作用是将字符串从正则表达式匹配的地方分开。
// split方法演示
String content ="Hello, this is an iPad.";
String[] items = content.split("\\W+");// 使用非单词字符分割字符串
System.out.println(Arrays.toString(items));
// [Hello, this, is, an, iPad] 可以发现逗号也被当做分隔符给去掉了
// split方法的重载版本,允许你限制字符串分割的次数
items = content.split("\\W+",3);
System.out.println(Arrays.toString(items));
// [Hello, this, is an iPad.]
// 字符串的替换 replaceFirst和replaceAll方法
String str ="You make me cry, make me smile.";
System.out.println(str.replaceFirst("m\\w+","music"));// You music me cry, make me smile.
System.out.println(str.replaceAll("make|me","music"));// You music music cry, music music smile.
为了更加方便的使用正则表达式,强烈建议多去浏览JDK文档中java.util.regex.Pattern那一页的内容。
下面是一个用Java创建正则表达式的例子:
String content ="one step tototoo far.";
// 编译正则表达式生成一个Pattern对象
Pattern p =Pattern.compile("(to){2,}");
// 用Pattern对象的matcher()方法检索字符串,生成Matcher对象
Matcher m = p.matcher(content);while(m.find()){
System.out.println("Match \""+ m.group()+"\" ad position "+ m.start()+"-"+(m.end()-1));// output: Match "tototo" ad position 9-14
}
使用Matcher上的各种方法,可以判断各种不同类型的匹配是否成功:
boolean matches():
尝试将整个区域与模式匹配。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
返回:
当且仅当整个区域序列匹配此匹配器的模式时才返回 true。
boolean lookingAt():
尝试将从区域开头开始的输入序列与该模式匹配。
与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
返回:
当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。
boolean find():
尝试查找与该模式匹配的输入序列的下一个子序列。
此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
返回:
当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。
boolean find(int start):
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
如果匹配成功,则可通过 start、end 和 group 方法获取更多信息,而 find() 方法的后续调用将从此匹配操作未匹配的第一个字符开始。
返回:
当且仅当从给定索引开始的输入序列的子序列匹配此匹配器的模式时才返回 true。
抛出:
IndexOutOfBoundsException- 如果开始点小于零或大于输入序列的长度。
下面是一个使用 boolean find(int start)的例子:
// boolean find(int start)
String content ="wings you are the hero~";
Pattern p =Pattern.compile("\\w+");
Matcher m = p.matcher(content);
int i=0;
while(m.find(i)){
System.out.print(m.group()+" ");
i++;
}
输出内容为:
wings ings ngs gs s you you ou u are are re e the the he e hero hero ero ro o
主要看到Matcher的以下几个方法:
replaceAll
public String replaceAll(String replacement)
- 替换模式与给定替换字符串相匹配的输入序列的每个子序列。
replaceFirst
public String replaceFirst(String replacement)
- 替换模式与给定替换字符串匹配的输入序列的第一个子序列。
appendReplacement
public Matcher appendReplacement(StringBuffer sb,
String replacement)
- 实现非终端添加和替换步骤。此方法执行以下操作:
appendTail
public StringBuffer appendTail(StringBuffer sb)
- 实现终端添加和替换步骤。此方法从添加位置开始从输入序列读取字符,并将其添加到给定字符串缓冲区。可以在一次或多次调用
appendReplacement
方法后调用它来复制剩余的输入序列。
下面通过一个程序来演示一下这几个方法的使用,并且通过这个程序,更加熟悉正则表达式的使用:
String content = "/*! long long ago, the is a man called Jack, \n" +
" he has one boat. !*/";
// Pattern.DOTALL: 这种模式下 . 可以匹配任何字符,包括换行符
Pattern p = Pattern.compile("/\\*!(.*)!\\*/", Pattern.DOTALL);
Matcher m = p.matcher(content);
if(m.find())
// 匹配到/*! !*/中的内容
content = m.group(1);
// 把两个以上空格的地方缩减为一个空格
content = content.replaceAll(" {2,}", " ");
// 开启多行模式,删除每一行开头部分的空格,+表示匹配一个或多个
content = content.replaceAll("(?m)^ +", "");
// 匹配到字符串中的第一个元音字母,并替换为VOWEL
content = content.replaceFirst("[aeiou]", "VOWEL");
// 下面一段程序演示把字符串中的所有元音字母替换为大写
Pattern p1 = Pattern.compile("[aeiou]");
Matcher m1 = p1.matcher(content);
StringBuffer sb = new StringBuffer();
while(m1.find()){
// 非终端添加和替换,
m1.appendReplacement(sb, m1.group().toUpperCase());
}
// 终端添加和替换
m1.appendTail(sb);
System.out.println(sb);
输出结果为:
lVOWELng lOng AgO, thE Is A mAn cAllEd JAck,
hE hAs OnE bOAt.
注意,上面的两个替换操作都只使用了一次replaceAll(),所以,与其编译为Pattern,不如直接使用String的replaceAll()方法,而且开销也比较小。
.
.
.
.
Java Pattern Matcher 正则应用的更多相关文章
- java Pattern(正则)类
Pattern的静态方法matches 用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串. Boolean b=Pattern.matches("^((13[0-9])|(15 ...
- Java Pattern Matcher 正则表达式需要转义的字符
见:http://blog.csdn.net/bbirdsky/article/details/45368709 /** * 转义正则特殊字符 ($()*+.[]?\^{},|) * * @param ...
- java Pattern和Matcher详解
结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String ...
- Java 中的正则(Pattern)
/**String 中 replaceAll(),matches(),split() 等方法,都是调用Pattern中的方法.学习了,瞬间觉得Pattern强大了 public String repl ...
- 正则表达式 Pattern & Matcher
1 compile and pattern Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(Strin ...
- Java代码使用正则验证和常用工具方法
1.正则验证邮箱 public static boolean checkEmail(String email){ boolean flag = false; try{ String check = & ...
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(4)补充: Java正则表达式Matcher.group(int group)相关类解析
在Java正则表达式的相关类Matcher中,有如下几个方法: - int groupCount() - String group(int group) - int start(int group) ...
- JAVA正则表达式matcher.find()和 matcher.matches()的区别
1.find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数.matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为数 ...
- java Pattern
public class Test{ //匹配替换掉order by之后的字符串 public static void main(String[] args) { Pattern pattern = ...
随机推荐
- awk的用法(转)
awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...
- IOS 播放音频
1,播放短音频 #import <AudioToolbox/AudioToolbox.h>#import "GLYViewController.h"static voi ...
- JS 原型 & 继承
理解原型链 先看看http://www.ituring.com.cn/article/56184和http://www.cavabiao.com/prototype-and-inherit-of-ja ...
- C++ 面向对象学习1
#include "stdafx.h" #include <iostream> //不要遗漏 否则不能使用cout using namespace std; class ...
- sql server 常见问题
自动生成的值 @@identity 存储过程参数应指定参数长度,且不大于数据库长度,自定义方法里如果有参数,也应指定长度,否则会报错,提取数据长度被断 connectionString 可以指定app ...
- python下读取excel文件
项目中要用到这个,所以记录一下. python下读取excel文件方法多种,用的是普通的xlrd插件,因为它各种版本的excel文件都可读. 首先在https://pypi.python.org/py ...
- TreeView控件例子
XmL文件代码: <?xml version="1.0" encoding="utf-8" ?> <Area> <Province ...
- 导入jsp
<%@ page contentType="text/html;charset=UTF-8" %><%@ page isELIgnored="false ...
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- Opencv 学习资料集合(更新中。。。)
基础学习笔记之opencv(24):imwrite函数的使用 tornadomeet 2012-12-26 16:36 阅读:13258 评论:9 基础学习笔记之opencv(23):OpenCV坐标 ...