一、正则表达式
- 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
- 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的
- 正则表达式也是一个字符串
- String类有个方法matches()方法,是专门用于检验字符串是否符合正则表达式的规则
String regex = "[1-9]\\d{4,14}";
System.out.println("565899885956".matches(regex));
二、字符类演示
1、字符类
- []:表示单个字符
- [abc] a、b 或 c(简单类):包含中括号里的任一字符
- [^abc] 任何字符,除了 a、b 或 c(否定):不包含中括号里的任一字符
- [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围):包含a到z或A-Z的任一字符(并集)
- [a-d[m-p]] a到d或者m-p(并集),相当于[a-dm-p]
- [a-z&&[def]] a-z和d,e,f 取交集
- [a-z&&[^def]] a-z和除了d,e,f 的取交集(减去)
- [a-z&&[^m-p]] a-z和除了m-p的取交集(减去)
- [0-9] 0到9的字符都包括:
注意:[]表示的单个字符,若字符串中有多个字符,则flase。
2、预定义字符类
- . 任何字符(注意:单个字符。.. 代表任意两个字符
- \d 数字:也就是[0-9],代表单个的数字字符
注意:\代表转义字符,如果想表示\d的话,需要\\d
- \D 非数字:也就是[^0-9],除了0-9
- \s 空白字符:[ \t\n\x0B\f\r]:\t为tab键,\n为换行,\x0B为DOS中的垂直制表符,\f为DOS中的翻页,\r为回车;
- \S 非空白字符:
- \w 单词字符:[a-zA-Z_0-9]
3、Greedy 数量词
- X? :X代表任意字符,?代表一次或一次也没有
String regex1 = "[abc]?";
System.out.println( "a".matches(regex1));
- X* :X代表任意字符,*代表零次或多次
- X+ :X代表任意字符,+代表一次或多次
- X{n}: X代表任意字符,{n}代表恰好 n 次
- X{n,} :X代表任意字符,{n,}至少 n 次
- X{n,m}: X代表任意字符,{n,m}代表至少 n 次,但是不超过m 次
三、正则表达式的分割功能
String类的分割功能:public String[] split(Stringregex):根据给定正则表达式的匹配拆分此字符串,返回一个字符串数组
public class Demo5_Split {
public static void main(String[] args) {
String s = "金三胖.郭美美.李dayone";
String[] arr = s.split("\\."); //通过正则表达式切割字符串,空格即为空格,但是点需要进行转义,单独点代表任意字符,会把字符串切碎。
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
四、正则表达式的替换功能
* String类的功能:publicString replaceAll(String regex,String replacement),根据指定的替换字符串来替换正则表达式里的字符,返回一个新的字符串。
五、正则表达式的分组功能
* 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
*
1 ((A)(B(C)))
2 (A
3 (B(C))
4 (C)
public class Demo7_Regex {
/**
* * A:正则表达式的分组功能
* 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
*
1 ((A)(B(C)))
2 (A
3 (B(C))
4 (C)
组零始终代表整个表达式。
*/
public static void main(String[] args) {
//demo1();
//demo2();
/*
* 需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
将字符串还原成:“我要学编程”。
*/
String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
String s2 = s.replaceAll("\\.+", "");
String s3 = s2.replaceAll("(.)\\1+", "$1"); //$1代表第一组中的内容
System.out.println(s3);
}
public static void demo2() {
//需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
String s = "sdqqfgkkkhjppppkl";
String regex = "(.)\\1+"; //+代表第一组出现一次到多次
String[] arr = s.split(regex);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void demo1() {
//叠词 快快乐乐,高高兴兴
/*String regex = "(.)\\1(.)\\2"; //\\1代表第一组又出现一次 \\2代表第二组又出现一次
System.out.println("快快乐乐".matches(regex)); //true
System.out.println("快乐乐乐".matches(regex)); //true
System.out.println("高高兴兴".matches(regex)); //true
System.out.println("死啦死啦".matches(regex));*/ //flase
//叠词 死啦死啦,高兴高兴
String regex2 = "(..)\\1";
System.out.println("死啦死啦".matches(regex2)); //true
System.out.println("高兴高兴".matches(regex2)); //true
System.out.println("快快乐乐".matches(regex2)); //flase
}
}