今天学习到正则表达式,真有意思。
在jdk文档中 Patten类有具体的规则描述:
常用的是这几个:
A:字符
x 字符 x。举例:‘a’表示字符a
\ 反斜线字符。
\n 新行(换行)符 (’\u000A’)
\r 回车符 (’\u000D’)B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括C:预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? .
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixiE:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
正则表达式的判断功能:
现在展示俩个例子,一个验证手机号码,一个验证邮箱:
package com.st.basis.day14.RegularExpression;
import java.util.Scanner;
/*
* 正则表达式的应用
* 规则看jdk文档 Patten类
* */
public class RegaxDemo {
public static void main(String[] args) {
// 判断手机号码是否符合要求
labe:while(true){
Scanner sc = new Scanner(System.in);
System.out.println("输入手机号");
String input = sc.nextLine();
boolean out = demo01(input);
System.out.println(out); //输出验证的结果,true/fasle
while(out == true){
sc.close();
// return; //正确就跳出循环。
break labe; //俩种跳出循环方式
}
}
//判断邮箱
while(true){
Scanner sc = new Scanner(System.in);
System.out.println("输入邮箱号");
String input = sc.nextLine();
boolean out = demo02(input);
System.out.println(out);
while(out == true){
sc.close();
return;
}
}
}
//正则表达式判断功能
//String类中的public boolean matches(String regax)
private static boolean demo01(String input) {
String regax = "1[3-7]\\d{9}";
boolean res = input.matches(regax);
return res;
}
//判断邮箱
private static boolean demo02(String input) {
/*
* 123412@qq.com
* shishi@163.com
* hohhot@imut.edu.cn
* 分析: @前面的字符可能是数字也可能是字母,且数量不确定 : [a-zA-Z_0-9]+
* 然后 @ [a-zA-Z_0-9]+@
* @后面的也不确定是数字还是字母但肯定没大写.且数量不确定,但大致在2到6之间 [a-z_0-9]{2,6} [a-zA-Z_0-9]+@[a-z_0-9]{2,6}
* 然后 加一个点 \\. [a-zA-Z_0-9]+@[a-z_0-9]{2,6}\\.
* 然后后面只有英文 [a-z] [a-zA-Z_0-9]+@[a-z_0-9]{2,6}\\.[a-z]
* 但 .后面可能有好几个后缀 就需要改进 (\\.[a-z]{2,3})+ [a-zA-Z_0-9]+@[a-z_0-9]{2,6}(\\.[a-z]{2,3})+
*
* */
String regax = "[a-zA-Z_0-9]+@[a-z_0-9]{2,6}(\\.[a-z]{2,3})+";
boolean res = input.matches(regax);
return res;
}
}
正则表达式的分割功能:
package com.st.basis.day14.RegularExpression;
import java.util.Arrays;
import java.util.Scanner;
/*
*
* 正则表达式的应用
* 规则看jdk文档 Patten类
* 分割功能
*
* 应用实例:
* 上网站搜索,自己想限定年龄为 18-24岁女性
* 那在搜索条件中写入这个条件,提交以后系统拿到的就是一个字符串 "18-24"
* 系统进行比对就需要拿到18和24,而不是这个字符串
* 就可以用正则的分割功能
* public String[] split(String regex)
* 注意该方法返回的是一个String[]
* */
public class RegaxDemo2 {
public static void main(String[] args) {
demo01(); //搜索限定年龄
demo02(); //分割字符串
demo03(); //分割字符串并且排序
}
private static void demo01() { //搜索限定年龄
//输入筛选条件
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄范围:");
String range = sc.nextLine();
//定义规则
String regax = "-"; //输入的字符串格式是 18-24 规则就是 -
//调用
String[] arr = range.split(regax); //得到的是arr,里面放着 18,24
//获取数组中的值并转为int
int snum = Integer.parseInt(arr[0]); //得到了18
int endnum = Integer.parseInt(arr[1]); //得到了24
//筛选判断
System.out.println("请输入年龄");
int age = sc.nextInt();
if(age >= 18 && age <= 24){
System.out.println("合格");
}else{
System.out.println("不合格");
}
sc.close();
}
//
private static void demo02() {
String str = "aa,bb,cc"; //将aa,bb,cc这个字符串按 aa bb cc 输出
String[] arr = str.split(","); //调用方法 规则就是,
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("-----------------");
String str2 = "dd.ee.ff";
String[] arr2 = str2.split("\\."); //调用方法 规则是. 但在正则中.代表任意字符,所以需要转义
for(int i=0; i<arr2.length; i++){
System.out.print(arr2[i]+" ");
}
System.out.println();
System.out.println("-----------------");
String str3 = "gg hh qq"; //这个字符串中间有空格,但不确定有几个
String[] arr3 = str3.split(" +"); //调用方法 空格+ 代表一次或一次以上
for(int i=0; i<arr3.length; i++){
System.out.print(arr3[i]+" ");
}
System.out.println();
System.out.println("-----------------");
//硬盘中用\\代替\
String str4 = "F:\\学习资料\\01、第一阶段 Java基础(27天)\\day26\\avi";
String[] arr4 = str4.split("\\\\"); //调用方法 正则中\\代表\
for(int i=0; i<arr4.length; i++){
System.out.print(arr4[i]+" ");
}
System.out.println();
System.out.println("-----------------");
}
private static void demo03() {
String str = "27 89 75 22 15";
String[] arr = str.split(" ");
//字符串数组转int数组
int[] arr2 = new int[arr.length];
for(int i=0; i<arr.length; i++){
arr2[i] = Integer.parseInt(arr[i]);
}
//现在排序
Arrays.sort(arr2); //二分排序
//数组转字符串并输出
String res = Arrays.toString(arr2);
System.out.println(res); //输出的是:[15, 22, 27, 75, 89] 但我不喜欢这个格式就自己拼接
//自己拼接
StringBuilder sb = new StringBuilder();
for(int i=0; i<arr.length; i++){
if(i<arr.length-1){
sb.append(arr2[i]).append(" ");
}else{
sb.append(arr2[i]);
}
}
System.out.println(sb.toString());
}
}
结果:
[15, 22, 27, 75, 89]
15 22 27 75 89
正则表达式的替换功能:
package com.st.basis.day14.RegularExpression;
/*
* 正则表达式
* 替换功能
* public String replaceAll(String regex,String replacement)
* 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
* */
public class RegaxDemo3 {
public static void main(String[] args) {
demo01();
}
private static void demo01() {
String str = "hohot666beijing123java";
//去除所有数字,用*替换
String regax = "\\d+"; //正则 规则
String s = "*"; //替换的字符串
//调用方法
String res = str.replaceAll(regax, s);
System.out.println(res);
}
}
结果
hohot*beijing*java
正则表达式的获取功能:
package com.st.basis.day14.RegularExpression;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正则表达式
* 获取功能
* API说明:
* Pattern和Matcher类的使用
* public final class Patternextends Object implements Serializable
* 正则表达式的编译表示形式。
*
* 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
*
* 因此,典型的调用顺序是
*
* Pattern p = Pattern.compile("a*b");
* Matcher m = p.matcher("aaaaab");
* boolean b = m.matches();
* */
public class RegaxDemo4 {
public static void main(String[] args) {
demo01(); //引出
demo02();
}
private static void demo01() {
//将这个规则编译成模式对象
Pattern p = Pattern.compile("a*b"); //"a*b"是一个规则 *:0次或多次
//通过模式对象得到匹配器对象
Matcher m = p.matcher("aaaaab"); //"aaaaab"是需要匹配的字符串
boolean b = m.matches(); //调用匹配去对象的功能
System.out.println(b); //输出结果 true
//上述是一个针对与API例子做的demo,但实际要满足上述需求这样做就可以:
String str = "aaaaab";
String regex = "a*b";
boolean res = str.matches(regex);
System.out.println(res);
}
//获取功能:获取下列字符串中由三个字符组成的单词
//String str = "ni hao a, wo shi java ai hao zhe.ni ne ?"
private static void demo02() {
String str = "ni hao a, wo shi java ai hao zhe.ni ne ?";
String regex = "\\b[a-zA-Z]{3}\\b"; // \b单词边界 [a-zA-Z]{3}三个字符组成的字串
//将这个规则编译成模式对象
Pattern p = Pattern.compile(regex);
//通过模式对象得到匹配器对象
Matcher m = p.matcher(str);
//调用匹配去对象的功能
//通过find方法 查找有没有满足条件的字串
boolean res = m.find();
System.out.println(res); //输出 true 说明有符合规则的字串
//下面输出这些字串
while(m.find()){
System.out.println(m.group()); //先利用find方法,再利用group方法
}
}
}
结果
true
shi
hao
zhe