package lcg;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正则表达式对字符串的常见操作:
* 1、匹配
* 使用的是String类中的matches方法。
* 2、切割
* 其实就是使用的是String类中的split
* 3、替换
* 其实就是使用的是String类的replaceAll()方法;
* 4、获取
* 将正则规则进行对象的封装
* //Pattern p = Pattern.compile("a*b");
* //通过正则对象的matcher方法字符串相关联。获取要对字符串操作操作的匹配对象Matcher
* Matcher m = p.matcher("aaaaab");
* //通过Matcher匹配器对象的方法对字符串进行操作
* boolean b = m.matches();
* */
public class Test {
public static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
fuctionDemo_4();
}
//演示获取
private static void fuctionDemo_4() {
String str="da jia hao ,ming tian bu fang jia!";
String regex="\\b[a-z]{3}\\b";//\b 单词边界
//1、将正则封装成对象
Pattern p = Pattern.compile(regex);
//2、通过正则对象获取匹配器对象
Matcher m=p.matcher(str);
//使用Matcher对象的方法对字符串进行操作
//既然要获取三个字符组成的单词
//查找。find()
System.out.println(str);
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+"::"+m.end());
/*结果:da jia hao ,ming tian bu fang jia!
jia
3::6
hao
7::10
jia
30::33*/
}
}
//演示替换
private static void fuctionDemo_3() {
/*String s="xiaoqiangtttttwanghuanghhhhhhhhhwangxiao";
String eg="(.)\\1+";
//把叠词替换成#
String st=s.replaceAll(eg, "#");
System.out.println(st);
//结果:xiaoqiang#wanghuang#wangxiao
*/ String s="xiaoqiangtttttwanghuanghhhhhhhhhwangxiao";
String eg="(.)\\1+";
//把叠词替换成#
String st=s.replaceAll(eg, "$1");
System.out.println(st);
//结果:xiaoqiangtwanghuanghwangxiao
String phone="15863818654";
String eg1="(\\d{3})\\d{4}(\\d{4})";
String st1=phone.replaceAll(eg1, "$1****$2");
System.out.println(st1);
//结果:158****8654
}
//演示切割
public static void fuctionDemo_2(){
/*String s="** ** ** **";
String eg=" +";//一次或多次 空格
String[] names=s.split(eg);
for(String name:names){
System.out.println(name);
String s="**.**.**.**";
//String eg=".";//.在正则表达式中有特殊含义代表:任何字符,所以要想真正用.得转义
String eg="\\.";
String[] names=s.split(eg);
for(String name:names){
System.out.println(name);
}*/
String s="xiaoqiangtttttwanghuanghhhhhhhhhwangxiao";
/*捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
*/
String eg="(.)\\1+";//()是组的含义,,
String[] names=s.split(eg);
for(String name:names){
System.out.println(name);
}
}
//演示匹配
public static void fuctionDemo_1(){
//检验手机号
boolean falge=true;
while(falge){
System.out.println("输入手机号:");
String phone=scanner.next();
//第一位是1,第二位是358中的一位,剩下的9位为0~9任意一位
//String eg="1[358][0-9]{9}";
//\d代表[0-9],但\代表转义,所以用\\代表转义后为\
String eg="1[358]\\d{9}";
boolean a=phone.matches(eg);
System.out.println(a);
System.out.println("输入1退出验证");
int i=scanner.nextInt();
if(i==1){
falge=false;
}
}
}
public static void greedy() {
/*X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
* */
String s="aoob";
String eg="ao?b";//开头a,结尾b,中间0次或者1次o;
boolean a=s.matches(eg);
System.out.println(s+"2:"+a);//false
s="aob";
a=s.matches(eg);
System.out.println(s+"1:"+a);//true
s="ab";
a=s.matches(eg);
System.out.println(s+"0:"+a);//true
s="aooob";
eg="ao+b";//开头a,结尾b,中间1次或者多次o;
a=s.matches(eg);
System.out.println(s+"o+:"+a);//true
s="aoooob";
eg="ao{4}b";//开头a,结尾b,中间4次o;
a=s.matches(eg);
System.out.println(s+"o(4)+:"+a);//true
}
}
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正则表达式对字符串的常见操作:
* 1、匹配
* 使用的是String类中的matches方法。
* 2、切割
* 其实就是使用的是String类中的split
* 3、替换
* 其实就是使用的是String类的replaceAll()方法;
* 4、获取
* 将正则规则进行对象的封装
* //Pattern p = Pattern.compile("a*b");
* //通过正则对象的matcher方法字符串相关联。获取要对字符串操作操作的匹配对象Matcher
* Matcher m = p.matcher("aaaaab");
* //通过Matcher匹配器对象的方法对字符串进行操作
* boolean b = m.matches();
* */
public class Test {
public static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
fuctionDemo_4();
}
//演示获取
private static void fuctionDemo_4() {
String str="da jia hao ,ming tian bu fang jia!";
String regex="\\b[a-z]{3}\\b";//\b 单词边界
//1、将正则封装成对象
Pattern p = Pattern.compile(regex);
//2、通过正则对象获取匹配器对象
Matcher m=p.matcher(str);
//使用Matcher对象的方法对字符串进行操作
//既然要获取三个字符组成的单词
//查找。find()
System.out.println(str);
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+"::"+m.end());
/*结果:da jia hao ,ming tian bu fang jia!
jia
3::6
hao
7::10
jia
30::33*/
}
}
//演示替换
private static void fuctionDemo_3() {
/*String s="xiaoqiangtttttwanghuanghhhhhhhhhwangxiao";
String eg="(.)\\1+";
//把叠词替换成#
String st=s.replaceAll(eg, "#");
System.out.println(st);
//结果:xiaoqiang#wanghuang#wangxiao
*/ String s="xiaoqiangtttttwanghuanghhhhhhhhhwangxiao";
String eg="(.)\\1+";
//把叠词替换成#
String st=s.replaceAll(eg, "$1");
System.out.println(st);
//结果:xiaoqiangtwanghuanghwangxiao
String phone="15863818654";
String eg1="(\\d{3})\\d{4}(\\d{4})";
String st1=phone.replaceAll(eg1, "$1****$2");
System.out.println(st1);
//结果:158****8654
}
//演示切割
public static void fuctionDemo_2(){
/*String s="** ** ** **";
String eg=" +";//一次或多次 空格
String[] names=s.split(eg);
for(String name:names){
System.out.println(name);
String s="**.**.**.**";
//String eg=".";//.在正则表达式中有特殊含义代表:任何字符,所以要想真正用.得转义
String eg="\\.";
String[] names=s.split(eg);
for(String name:names){
System.out.println(name);
}*/
String s="xiaoqiangtttttwanghuanghhhhhhhhhwangxiao";
/*捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
*/
String eg="(.)\\1+";//()是组的含义,,
String[] names=s.split(eg);
for(String name:names){
System.out.println(name);
}
}
//演示匹配
public static void fuctionDemo_1(){
//检验手机号
boolean falge=true;
while(falge){
System.out.println("输入手机号:");
String phone=scanner.next();
//第一位是1,第二位是358中的一位,剩下的9位为0~9任意一位
//String eg="1[358][0-9]{9}";
//\d代表[0-9],但\代表转义,所以用\\代表转义后为\
String eg="1[358]\\d{9}";
boolean a=phone.matches(eg);
System.out.println(a);
System.out.println("输入1退出验证");
int i=scanner.nextInt();
if(i==1){
falge=false;
}
}
}
public static void greedy() {
/*X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
* */
String s="aoob";
String eg="ao?b";//开头a,结尾b,中间0次或者1次o;
boolean a=s.matches(eg);
System.out.println(s+"2:"+a);//false
s="aob";
a=s.matches(eg);
System.out.println(s+"1:"+a);//true
s="ab";
a=s.matches(eg);
System.out.println(s+"0:"+a);//true
s="aooob";
eg="ao+b";//开头a,结尾b,中间1次或者多次o;
a=s.matches(eg);
System.out.println(s+"o+:"+a);//true
s="aoooob";
eg="ao{4}b";//开头a,结尾b,中间4次o;
a=s.matches(eg);
System.out.println(s+"o(4)+:"+a);//true
}
}