1.正则表达式
1.1概念
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
不仅限于某一种语言,但是在每种语言中有细微的差异
java中1.4推出, java.util.regex包下
在java中 使用\转义符,把有意义字符转换为无意义字符
但是在正则表达式中,\也是转义符,所以如果我们在java中书写正则表达式的转义符的话,要写两个\\
1.2语法
\转义符
* .匹配任意字符
*取值范围:
* [abc]:可能是a,也可能是b,也可能是c
* [^abc]:不是a,b,c任意一个
* [a-zA-Z]:匹配大小写字母
* [^a-zA-Z]:非大小写字母
* [0-9]:数字
* [a-zA-Z0-9]:大小写字母和数字
*间接表示:
* . :任意字符
* \d:表示数字[0-9]
* \D:表示非数字 [^0-9]
* \s:表示由空字符组成
* \S:表示由非空字符组成
* \w:表示字母数字下划线[a-zA-Z0-9_]
* \W:表示非字母数字下划线[a-zA-Z0-9_]
*数量相关:
* ?:表示出现0或1次
* +:表示出现一次或多次count>=1
* *:表示出现0次或0次以上count>=0
* {n}:表示出现n次
* {n,}:表示出现n次或n次以上 count>=n
* {n,m}:表示出现n到m次 m>=count>=n
*
*():表示一个整体
* ([a-z]|[0-9]){2}:a-z或0-9两个其中一个出现两次
*[]:可以理解为字符组,字符组中-为连接符,表示区间范围
* [0-9]:表示0123456789都可以
*{}:表示范围
*
*^:表示开头,在[]中表示取反
*$:表示结尾
*
*在java中 正则表达式封装为三个相关的类
* PatternSyntaxException:异常类
* Pattern:正则表达式对象,能做一些简单操作
* Matcher:支持强大的正则表达式
*
*Pattern:很多时候我们直接使用String中的三个方法即可:
* 验证:校验操作,boolean matches(String regex)
* 拆分:String[]split(String regex)
* 替换:String replaceAll(String regex,String replace)
1.3在java中正则表达式
在java中正则表达式封装为三个相关的类
PatternSyntaxException:异常类
Pattern:正则表达式对象,能做一些简单操作
Matcher:支持强大的正则表达式
1.3.1Pattern
概述:
用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建
可以通过Pattern.complie(String regex)创建一个正则表达式
只能做一些简单的匹配操作
使用:
Pattern:很多时候我们直接使用String中的三个方法即可:
验证:校验操作,boolean matches(String regex)
拆分:String[]split(String regex)
替换:String replaceAll(String regex,String replace)
public static void main(String[] args) {
test1();
test2();
}
//校验
public static void test2(){
//非正整数
String regex="(-?[1-9]\\d*|0)";
String str="-123";
//全词匹配,静态方法
boolean flag=Pattern.matches(regex, str);
System.out.println(flag);
//String 中的方法
System.out.println(str.matches(regex));
}
//拆分
public static void test1(){
String str="1,2,3,4,5";
//创建正则表达式
Pattern pattern=Pattern.compile(",");
//拆分方法
String[]strs=pattern.split(str);
//遍历
for(String string:strs){
System.out.println(string);
}
System.out.println("=========================");
strs=str.split(",");
for(String string:strs){
System.out.println(string);
}
}
Matcher概述:
1.构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例 Matcher m = p.matcher("aaaaab");
2.支持便捷强大的正则匹配操作,包括分组、多次匹配支持
三大方法:
Matcher.matches():对整个字符串进行匹配,只有整个字符串都匹配了才返回true
Matcher.lookingAt():对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
Matcher.find():对字符串进行匹配,匹配到的字符串可以在任何位置
字符串匹配模式:
public static void main(String[] args) {
//整数规则
String regex="(-?[1-9]\\d*)|0)";
//需要校验的字符串
String input="12.12";
//引进对象
Pattern pattern =Pattern.compile(regex);
//匹配器对象
Matcher matcher=pattern.matcher(input);
/**
* 三种匹配模式
* matches:全词匹配
* find:任何位置均可 asd123das
* lookingAt:从前向后,前面是就可以 123sadasd
*
*/
//false
System.out.println(matcher.matches());
//不要连着使用,每次使用 都重新打开一个matcher对象即可
//find可以调用多次,因为find适合做一些提取操作
matcher=pattern.matcher(input);
System.out.println(matcher.find());
System.out.println(matcher.find());
System.out.println(matcher.find());
matcher=pattern.matcher(input);
System.out.println(matcher.lookingAt());
}
数据提取:
public static void main(String[] args) {
//整数规则
//[\u4e00-\u9fa5]汉字范围
//一个小括号 就是一组
String regex="([\u4e00-u9fa5]{2,3})电话号码是(\\d{11})";
String input="asd小明电话号码是1311311311sass张小黑电话号码是1511511511511";
//引进对象
Pattern pattern=Pattern .compile(regex);
//匹配器对象
Matcher matcher=pattern.matcher(input);
/**
* find和group结合使用 可以完成数据提取
*/
//想要获取下一个匹配的数据,只需要再次调用find即可
//如果find为false,说明后面没有符合条件的数据了
while(matcher.find()){
//0或者无参 都是获取匹配到的整个数据
//1就是第一组,2就是第二组
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
叠词去重:
我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.
*
* 转换为我要学编程
*
* 1.只留下汉字,其余字符去掉
* 2.把重复数据分为两组,比如1111,分为1和111
* 3.使用1把1111替换
* @author 18370
*
*/
public class MatcherTest_03 {
public static void main(String[] args) {
String string="我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.";
//1.先把.去掉
//string=string.replaceAll("\\.","");
//用空字符将除过汉字以外的全部替换
string=string.replaceAll("[^\u4e00-\u9fa5]","");
// ((我)(我我我我))(要)(要要要要)学学学学学编编编编编程程程程程程程
System.out.println(string);
// (.) : 任意字符
// \\1 捕获1次,获取指定组的数据, //1就是第一组的数据,//2就是第二组的数据
// (\\d)\\1 : 表示连续出现两个字符 , 11,22,33,44
// (\\d)(a)\\1 : 第一个是数字,第二个是a,第三个和第一个相同 1a1,2a2,3a3
// (\\d)(a)\\2 : 第一个是数字,第二是a,第三个和第二个一样,也是a,1aa,2aa,3aa
String regex="(.)(\\1+)";
//Pattern pattern=Pattern.compile(regex);
//Mather matcher=pattern.matcher(string);
//while(matcher.find()){
// //System.out.println(matcher.group(0));
// //System.out.println(matcher.group(1));
// //System.out.println(matcher.group(2));
//string=string.replaceAll(matcher.group(0),matcher.group(1));
//}
//System.out.println(string);
//$1就等于matcher.group(1);
string=string.replaceAll(regex,"$1");
System.out.println(string);
}
public static void main(String[] args) {
String string="我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.";
//1.先把.去掉
//string=string.replaceAll("\\.","");
//用空字符将除过汉字以外的全部替换
string=string.replaceAll("[^\u4e00-\u9fa5]","");
String regex="(.)(\\1+)";
//$1就等于matcher.group(1);
string=string.replaceAll(regex,"$1");
System.out.println(string);
}