import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正则表达式:符合一定规则的表达式,
* 作用:用于专门操作字符串
* 特点:用于一些特定的符号来表示一些代码操作,这样就简化书写
* 学习正则表达式就是在学习一些特殊的符号是使用
* 好处:可以简化对字符串的复杂操作
* 弊端:符号定义越多,正则越长,阅读性越差。
* 具体操作功能:
* 1:匹配:string matches方法,用规则匹配整个字符串,
* 只要一处不符合规则,就匹配结束,返回false
* 2:切割:string split ();
* 3:替换:string replaceAll();
* 4:获取:将字符串中的符合规则的子串取出
* 规则:1:将正则表达式封装成对象;
* 2:让正则对象和操作的字符串相关联
* 3:关联后,获取正则匹配引擎
* 4:通过引擎对符合规则的子串进行操作,比如取出
*/
public class RegecDemo {
public static void main(String[] args) {
splitdemo("zhangsan lisi wangwu", " +");
// splitdemo("d:\\123\\a.txt", " \\\\");//按照\\来切
splitdemo("erkktyqquizzo", " (.)\\1+");//按照叠词来切
/*组的使用
* (.)组的概念,为了可以让规则的结果能够重用,可以将规则封装成一个组。
* 使用()完成。组的出现都有编号,从1开始。想要使用已有的组可以通过\n
* (n就是组的编号)的形式来获取。分为几组可以查左括号,有几个左括号有几组
*/
String str="asdffjasdfj14234234";
replaceAllDemo(str, "\\d{5,}", "#");//将字符串中的数组替换成#键
String str1="adfjddfhjfhdjhqwisdddddadfjkafja";
replaceAllDemo(str1, "(.)\\1+", "&");//将叠词替换为&
replaceAllDemo(str1, "(.)\\1+", "$1");//将重叠的字符替换为单个字符
}
//正则获取
public static void name() {
String str="ni hao ,wo shi zhang san";
//str="123456";
// String reg="[1-9]\\d{4,14}";
String reg="\\b[a-z]{4}\\b";//查询连续四个字符的词组
//将规则封装成对象
Pattern p=Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象
Matcher m=p.matcher(str);
/*System.out.println(m.matches());
* 其实string类中的matches方法,用的就是pattern和matcher对象来完成的。
* 只不过被string的方法封装后,用起来较为简单,但是功能缺单一。
*/
/*boolean b=m.find();//将规则作用到字符串上,并进行符合规则的子串查找
System.out.println(b);
System.out.println(m.group());//用于获取匹配后结果
*/
while (m.find()) {
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());//分隔符的开始和结束
}
/*
* 用于获取匹配后结果
*/
}
//正则替换
public static void replaceAllDemo(String str,String reg,String newstr) {
str=str.replaceAll(reg, newstr);
System.out.println(str);
}
//正则表达式的切割功能
public static void splitdemo(String str,String reg) {
// String reg=" +";//表示多个空格
// String reg1="\\.";//正则表达式中.表示为任意一个字符使用\\.来转义一下才可以使用.来切割
String [] arr=str.split(reg);
System.out.println(arr.length);//显示arr的长度
for (String s : arr) {
System.out.println(s);
}
}
//正则表达式的解释
public static void demo() {
String str="a";
//表示bcd内的任意一个,[a-z]内的字符
String reg="[bcd][a-z]";
boolean b=str.matches(reg);
System.out.println(b);
}
//第二种使用正则表达式来检测qq号
/*
* 需求:对QQ号码进行校验
* 要求:5--15 位0不能开头,只能是数字
*/
public static void checkqq1() {
String qq="";
String regex="[1-9][0-9]{4-14}";
boolean flag=qq.matches(regex);
if (flag) {
System.out.println(qq+"...is ok");
}else {
System.out.println(qq+"...号码错误...");
}
}
/*
* 这种方法使用了string类中的方法,进行组合完成了需求,但是代码过于复杂
*/
public static void checkqq() {
String qq="12345";
int len=qq.length();
if (len>=5&&len<=15) {
if (!qq.startsWith("0")) {
try {
long l=Long.parseLong(qq);
System.out.println("qq:"+qq);
} catch (Exception e) {
System.out.println("出现非法字符");
}
/*char[] arr= qq.toCharArray();
boolean flag=true;
for (int i = 0; i < arr.length; i++) {
if (arr[i]>='0'&&arr[i]<='9') {
flag=false;
break;
}if (flag) {
System.out.println("qq:"+qq);
}else {
System.out.println("出现非法字符");
}
}*/
}else {
System.out.println("不可以0开头");
}
}
else {
System.out.println("长度错误");
}
}
}