正则表达式主要是操作字符串的规则,正则表达式对字符串的操作主要有以下几种应用:
匹配 matches:
切割 split:
替换replaceAll(String regex, String replacement):
查找:
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,
依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,
所以多个匹配器可以共享同一模式。 因此,典型的调用顺序是
Pattern p = Pattern.compile("正则");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
查找需要使用的对象:
1.Pattern(正则对象)
2.Matcher(匹配器对象)
匹配器要使用的方法:
1.find() 通知匹配器去匹配字符串,查找符合规则的字符串的子串。如果能查找到符合规则的字符串,则返回true,否则返回false。
2.group() 获取符合规则的子串
package com.cn.regex;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年7月20日10:02:06
* Desc:
正则表达式主要是操作字符串的规则,正则表达式对字符串的操作主要有以下几种应用:
匹配 matches:
切割 split:
替换replaceAll(String regex, String replacement):
查找:
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,
依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,
所以多个匹配器可以共享同一模式。 因此,典型的调用顺序是
Pattern p = Pattern.compile("正则");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
查找需要使用的对象:
1.Pattern(正则对象)
2.Matcher(匹配器对象)
匹配器要使用的方法:
1.find() 通知匹配器去匹配字符串,查找符合规则的字符串的子串。如果能查找到符合规则的字符串,则返回true,否则返回false。
2.group() 获取符合规则的子串
注意:使用group方法的时候一定要先调用find方法让匹配器去查找符合规则的字符串,否则报错。
*/
public class Demo3 {
public static void main(String[] args) {
String phone = "18071897425";
matchesPhone(phone);
phone = "0713-29962208";
matchesTel(phone);
String str = "请 叫 我 木 丁 西";
split1(str);
str = "请叫叫叫叫叫叫叫我木丁丁丁丁丁丁丁丁丁西"; //请 我木 西
split2(str);
str = "如有需求请联系我:18071897425如有需求请联系我:18071897425如有需求请联系我:18071897425如有需求请联系我:18071897425"
+ " 如有需求请联系我:18071897425如有需求请联系我:18071897425如有需求请联系我:18071897425如有需求请联系我:18071897425";
String replacement = "***";
replaceAll1(str, replacement);
str = "我我我要要要做做项项项项项项项项项项项项项目目";//还原成:我要做项目 把重叠词替换成单个词
replacement = "\\1";
replaceAll2(str, replacement);
pattern();
}
//正则对象
public static void pattern() {
String str;
//正则对象。。。。。查找
//找出3个字母组成的单词
str = "Qing jiao wo mu ding xi, hen gao xing ren shi ni men";
//先要把字符串的正则编译成正则对象
Pattern p = Pattern.compile("\\b[a-zA-Z]{3}\\b");//加上了边界匹配器
//使用正则对象匹配字符串产生一个匹配器对象
Matcher m = p.matcher(str);
System.out.println("有符合的字符串吗?" + m.find());;
while(m.find()){
System.out.print(m.group() + "\t");
}
}
/**
*需求1:编写一个正则表达式匹配手机号。
*1.第一位:1
*2.第二位:3 4 5 7 8
*3.长度:11位
* @param phone
*/
public static void matchesPhone(String phone) {
String regex = "1[34578]\\d{9}";
System.out.println(phone.matches(regex)?"号码格式正常":"非法手机号");
}
/**
* 需求2:匹配固定电话
* 区号-主机号
* 1.区号:首位为0 。。长度3~4位
* 2.主机号:首位不能为0。。长度7~8位
* @param tel
*/
public static void matchesTel(String tel){
String regex = "0\\d{2,3}-[1-9]\\d{6,7}";
System.out.println(tel.matches(regex)?"合法固定电话":"非法固定电话");
}
/**
* 按照空格切割
* @param str
*/
public static void split1(String str){
String regex = " +";
String[] strs = str.split(regex);
System.out.println(Arrays.toString(strs));
}
/**
* 根据重叠词进行切割
* @param str
*/
public static void split2(String str){
String regex = "(.)\\1+";//如果正则的内容需要被复用,那么需要对正则的内容进行分组。分组的目的就是为了提高正则的复用性。组号不能指定,组号从1开始。
String[] strs = str.split(regex);
System.out.println(Arrays.toString(strs));
}
/**
* 替换
* @param str
*/
public static void replaceAll1(String str, String replacement){
String regex = "1[34578]\\d{9}";
str = str.replaceAll(regex, replacement);//返回值就是替换后的结果
System.out.println(str);
}
/**
* 替换
* 如果需要在replaceAll方法正则的外部引用组的内容,那么是使用"$组号"
* @param str
* @param replacement
*/
public static void replaceAll2(String str, String replacement){
String regex = "(.)\\1+";
// str = str.replaceAll(regex, replacement); //如果需要在replaceAll方法正则的外部引用组的内容,那么是使用"$组号"
str = str.replaceAll(regex, "$1"); //如果需要在replaceAll方法正则的外部引用组的内容,那么是使用"$组号"
System.out.println(str);
}
}