正则表达式
一、正则表达式的概述和简单使用
1.正则表达式(正确规则的表达式,规则是java给我们定的):
是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特
殊的应用。
2.采用非正则表达式校验QQ号码
需求:校验qq号码.
1:要求必须是5-15位数字
2:0不能开头
private static boolean checkQQ(String numQQ) {
// 校验位数
boolean b = false;
// 判断长度
if (numQQ.length() >= 5 && numQQ.length() <= 15) {
// 判断开头不能为0
if (!(numQQ.startsWith("0"))) {
// 判断每一位是不是数字
for (int i = 0; i < numQQ.length(); i++) {
char ch = numQQ.charAt(i);
if (ch >= '0' && ch <= '9') {
b = true;
} else {
b = false;
break; //一旦遇到不是数字的,就结束循环
}
}
} else {
b = false;
}
} else {
b = false;
}
return b;
}
二、正则表达式的组成规则
规则字符在java.util.regex Pattern类中
1.字符
x 字符 x。举例:‘a’表示字符a
\ 反斜线字符。
\n 新行(换行)符 (’\u000A’)
\r 回车符 (’\u000D’)
2.字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
3.预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? .
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
4.边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi
5.Greedy 数量词
X? X,一次或一次也没有 比如""空串 就是没有
X* X,零次或多次 大于等于1次 都算多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
public class MyTest {
public static void main(String[] args) {
String regx = "b"; //用来匹配单个字符
regx = "[a,b,c,d,e,f,g]";//这个集合中所罗列的的任意一个字符
regx = "[a-z]";
regx = "[A,B,C]";
regx = "[A-Z]";
regx = "[0-9]";
regx = "[a-zA-Z0-9]";
regx = "[^a-z]"; //不是我罗列的某一个
regx = ".";//匹配单个任意字符
regx = "\\.";// \\ 转义字符 只匹配点本身
regx = "a|b"; // | 代表或者
regx = "\\|";//代表 竖线 转义
regx = "\\d"; // 跟[0-9] 意思一样
regx = "\\w";//跟 [a-zA-Z_0-9] 意思一样
regx = "a+b+"; //+代表一个或多个
regx = "[a-z]+";
regx = "a*"; //* 0次 或多次 一次也算多次
regx = "a?"; //一次或一次也不要出现
regx = "[a-zA-Z]{5}"; //正好几次
regx = "[0-9a-z]{5,}";//至少5次
regx = "[a-zA-Z]{5,15}";// 5<=次数<=15
boolean b = "12314a".matches(regx); //equals()方法
/* 需求:校验qq号码.
1:要求必须是5 - 15 位数字
2:0 不能开头*/
String qqRegx = "[1-9][0-9]{4,14}";
System.out.println(b);
//手机号正则:
String phoneRegx="[1][3,5,7,8,9][0-9]{9}";
}
}
三、正则表达式的判断功能
1.正则表达式的判断功能
String类的功能
public boolean matches(String regex)
2.采用正则表达式,校验用户邮箱是否满足要求
public class Demo {
public static void main(String[] args) {
// 需求:校验邮箱:6~18个字符,可使用字母、数字、下划线,需以字母开头
//1234567890@qq.com
System.out.println("请输入QQ邮箱用户名:");
Scanner scanner = new Scanner(System.in);
String username = scanner.nextLine();
String regx="[0-9]\\w{5,17}@qq\\.(com)";
boolean matches = username.matches(regx);
if(matches) {
System.out.println("邮箱用户名正确");
}else {
System.out.println("邮箱用户名不正确");
}
}
}
四、正则表达式的分割功能
1.正则表达式的分割功能
split()方法
String类的功能:public String[] split(String regex)
2.将给定字符串中的数字排序
分析:
a: 定义目标字符串"91 27 46 38 50"
b: 对这个字符串进行切割,得到的就是一个字符串数组
c: 把b中的字符串数组转换成int类型的数组
(1): 定义一个int类型的数组,数组的长度就是字符串数组长度
(2): 遍历字符串数组,获取每一个元素.将其转换成int类型的数据
(3): 把int类型的数据添加到int类型的数组的指定位置
d: 排序
e: 创建一个StringBuilder对象,用来记录拼接的结果
f: 遍历int类型的数组, 将其每一个元素添加到StringBuilder对象中
g: 就是把StringBuilder转换成String
h: 输出
public class Demo {
public static void main(String[] args) {
/* A:
案例演示:
需求:我有如下一个字符串:”91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”*/
String str="91 27 46 38 50";
//经过你的改造后变成 ==> "27 38 46 50 91"
String[] arr = str.split(" +");
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
//字符串数组,是按照字典顺序排的
//System.out.println(Arrays.toString(split));
//定义一个int类型的数组
int[] ints = new int[arr.length];
//遍历字符串数组,取出每一个元素,放到int 数组中
for (int i = 0; i < arr.length; i++) {
ints[i]=Integer.parseInt(arr[i]);
}
//排序int数组
Arrays.sort(ints);
//System.out.println(Arrays.toString(ints));
//遍历int数组拼串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ints.length; i++) {
sb.append(ints[i]).append(" ");
}
String string = sb.toString().trim();
System.out.println(string);
}
}
五、正则表达式的替换功能
1.正则表达式的替换功能
String类的功能:public String replaceAll(String regex,String replacement)
2.例子
public class Demo {
public static void main(String[] args) {
//根据正则表达式来替换
String str =
"assdfasf114 4asdsdfsfd887 99asdfdaasf55555asdfadfas88888asdfasdfdas asdfasdf";
//去掉上面字符串的中间空格
// String replace = str.replace(" ", "");
//System.out.println(replace);
//根据正则来替换
String s = str.replaceAll("[0-9 ]+", "");//将数字用空串代替,就删除了所有的数字
System.out.println(s);
}
}
六、正则表达式的获取功能
1.Pattern和Matcher的概述
模式器,匹配器,也是与正则相关的两个类
Pattern 模式器:用来封装正则表达式
Matcher 匹配器:用来存储匹配方法
用模式器,获取一个匹配器,把待匹配的字符串传入
Pattern p = Pattern.compile("a*b");
//调用匹配器中的匹配方法,进行匹配
Matcher m = p.matcher("aaaaab");
//返回值为boolean类型
boolean b = m.matches();
2.正则表达式的获取功能
Pattern和Matcher的结合使用
案例演示
使用的是 find()方法 和 group()方法 注意一定要先使用find()方法先找到 才能用group()方法
public class Demo {
public static void main(String[] args) {
//需求:获取出,下面字符串中是三个字母组成的单词
String str="da jia ting wo shuo, jin tian yao xia yu, bu shang wan zi xi, gao xing bu?";
//定义是三个字母组成的单词的正则
String regx="\\b[a-z]{3}\\b";
//把正则表达式封装进模式器
Pattern p = Pattern.compile(regx);
//根据模式器或取匹配器,传入待操作的数据
Matcher matcher = p.matcher(str);
/* boolean find ()
尝试查找与该模式匹配的输入序列的下一个子序列。*/
/* boolean b = matcher.find();
System.out.println(b);*/
/* String group () //截取出符合正则的数据
返回由以前匹配操作所匹配的输入子序列。*/
/*
String s = matcher.group();
System.out.println(s);
b = matcher.find();
System.out.println(b);
s = matcher.group();
System.out.println(s);*/这两个方法配合使用
while (matcher.find()){
String group = matcher.group();
System.out.println(group);
}
}
}