正则表达式
-概述:是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串,其实就是一种规则,有自己特殊的应用
-范例:
package regex;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
demo1 d = new demo1();
Scanner sc = new Scanner(System.in);
int count = 3;
while(count>0){
System.out.println("请输入qq号:");
String s =sc.nextLine();
if(d.qq(s)){
System.out.println("hello");
break;
}else{
count--;
}
}
}
public boolean qq(String str){
boolean flag = true;
if(str.charAt(0) == '0'){
flag = false;
System.out.println("不能以0开头");
}else if(str.length()<5||str.length()>15){
flag = false;
System.out.println("请输入指定长度");
}else {
char[] arr = str.toCharArray();
for (int i = 1; i < arr.length; i++) {
if(arr[i]<'0'||arr[i]>'9'){
flag = false;
}
}
}
return flag;
}
}
/*校验qq号码
1.要求必须是5-15位数字
2.0不能开头
3.必须都是数字*/
-用法:
*字符:
x | 字符 x |
\\ | 反斜线字符 |
\0n | 带有八进制值 0 的字符 n (0 <= n <= 7) |
\0nn | 带有八进制值 0 的字符 nn (0 <= n <= 7) |
\0mnn | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) |
\xhh | 带有十六进制值 0x 的字符 hh |
\uhhhh | 带有十六进制值 0x 的字符 hhhh |
\t | 制表符 ('\u0009') |
\n | 新行(换行)符 ('\u000A') |
\r | 回车符 ('\u000D') |
\f | 换页符 ('\u000C') |
\a | 报警 (bell) 符 ('\u0007') |
\e | 转义符 ('\u001B') |
\cx | 对应于 x 的控制符 |
*字符类:
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
*预定义字符类:
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
*Greedy数量词:
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
-正则表达式的分割功能:
public String[] split(String regex)
package regex;
public class demo3_split {
public static void main(String[] args) {
String s = "123 abc 哈罗";
String s1 = "123.abc.哈罗";
String regex = " ";
String regex2 = "\\."; //"."默认位任意字符,当想要以.为规则来切割字符串时,需要转义,并加上\\
String[] arr = s.split(regex); //split中匹配的是正则表达式
String[] arr1 = s1.split(regex2);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+" ");
}
}
}
*根据匹配的正则表达式来分割字符串,并返回一个String数组
-正则表达式的替换功能:
public String replaceAll(String regex,String replacement)
package regex;
public class demo_replaceAll {
public static void main(String[] args) {
String s1 = "hello111world222";
String s2 = "\\d";
System.out.println(s1.replaceAll(s2, ""));
}
}
-正则表达式的分组功能:
* 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 (A
3 (B(C))
4 (C)
组零始终代表整个表达式。
package regex;
public class demo_zu {
public static void main(String[] args) {
String regex = "(..)\\1";
System.out.println("大三大三".matches(regex));
String regex1 = "(\\d)\\1(\\w)\\2";
System.out.println("11ss".matches(regex1));
System.out.println("1s2s".matches(regex1));
}
}
-范例:a:切割
需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
b:替换
需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
将字符串还原成:“我要学编程”。
package test;
public class test13 {
public static void main(String[] args) {
String s1 = "sdqqfgkkkhjppppkl";
String regex1 = "(.)\\1+"; //代表第一组出现了多次
String[] arr = s1.split(regex1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
String s2 = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
String regex2 = "\\.+";
String regex3 = "(.)\\1+";
s2 = s2.replaceAll(regex2, "");
System.out.println(s2);
s2 = s2.replaceAll(regex3, "$1"); //将第一个出现的内容替换之后相同的内容
System.out.println(s2);
}
}
55.pattern类和Matcher类的概述
*pattern:正则表达式的编译形式,指定为字符串的正则表达式必须首先被编译为此类的实例,然后可将得到的模式用于创建Matcher对象,依照正则表达式,该模式可以与任意字符序列匹配,执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
*Matcher:通过解释pattern对character sequence(字符序列)执行匹配操作的引擎,通过调用模式的matches方法创建匹配器,创建匹配器后,可以执行三种不同的匹配操作:
1.matches方法尝试将整个字符序列与该模式匹配
2.lookintAt尝试将输入序列从头与该模式匹配
3.find方法扫描输入序列以查找与该模式匹配的下一个子序列
每个方法都返回一个Boolean来判断是否匹配成功
-模式与匹配器的典型调用顺序:
* Pattern p = Pattern.compile("a*b");
* Matcher m = p.matcher("aaaaab");
* boolean b = m.matches();
System.out.println("aaaaab".matches("a*b"); //执行结果与上面一致
-常用方法:
*public boolean find(); //若匹配成功,则下一次从未匹配的第一个字符开始
*public boolean matches();
*public string group(); //返回由以前操作所匹配的字符序列
-正则表达式的获取功能:
-将pattern和matcher结合使用
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class demo_huoqu {
public static void main(String[] args) {
String s1 = "我的第一个手机号是:18912345678,我的第二个手机号是:18876543210,我的第三个手机号是:17312345678";
String regex = "1[35789]\\d{9}";
/*Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s1);
boolean b = m.matches();
System.out.println(b);*/
Pattern p = Pattern.compile(regex); //匹配正则表达式
Matcher m = p.matcher(s1); //获取匹配器
while(m.find())
System.out.println(m.group());
}
}
/* 需求:把一个字符串中的手机号码获取出来*/