java学习日记_67:正则表达式

题目:



  校验qq号码.

  1:要求必须是5-15位数字
  2:0不能开头
  
  分析:
  A:键盘录入一个QQ号码
  B:写一个功能实现校验
  C:调用功能,输出结果。


import java.util.Scanner;


public class RegexDemo {
	public static void main(String[] args) {
		// 创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你的QQ号码:");
		String qq = sc.nextLine();
		
		System.out.println("checkQQ:"+checkQQ(qq));
	}








	/*
	  写一个功能实现校验 两个明确: 明确返回值类型:boolean 明确参数列表:String qq
	 */
	public static boolean checkQQ(String qq) {
		boolean flag = true;




		// 校验长度
		if (qq.length() >= 5 && qq.length() <= 15) {
			// 0不能开头
			if (!qq.startsWith("0")) {
				// 必须是数字
				char[] chs = qq.toCharArray();
				for (int x = 0; x < chs.length; x++) {
					char ch = chs[x];
					if (!Character.isDigit(ch)) {
						flag = false;
						break;
					}
				}
			} else {
				flag = false;
			}
		} else {
			flag = false;
		}




		return flag;
	}
}





以上代码引出要学的内容: 正则表达式 正则表达式是指符合一定规则的表达式,可以按照给出的表达式对字符串进行一系列的操作,方便对字符串的处理,解决一些实际的问题。

正则表达式有很多的规则,而Pattern是正则表达式的编译表示形式:


/*
构造                               匹配
字符 
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] 
  
POSIX 字符类(仅 US-ASCII) 
\p{Lower} 		小写字母字符:[a-z] 
\p{Upper} 		大写字母字符:[A-Z] 
\p{ASCII} 		所有 ASCII:[\x00-\x7F] 
\p{Alpha} 		字母字符:[\p{Lower}\p{Upper}] 
\p{Digit} 		十进制数字:[0-9] 
\p{Alnum} 		字母数字字符:[\p{Alpha}\p{Digit}] 
\p{Punct} 		标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 
\p{Graph} 		可见字符:[\p{Alnum}\p{Punct}] 
\p{Print} 		可打印字符:[\p{Graph}\x20] 
\p{Blank} 		空格或制表符:[ \t] 
\p{Cntrl} 		控制字符:[\x00-\x1F\x7F] 
\p{XDigit} 		十六进制数字:[0-9a-fA-F] 
\p{Space} 		空白字符:[ \t\n\x0B\f\r] 
  
java.lang.Character 类(简单的 java 字符类型) 
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase() 
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase() 
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace() 
\p{javaMirrored} 等效于 java.lang.Character.isMirrored() 
  
Unicode 		块和类别的类 
\p{InGreek} 	Greek 块(简单块)中的字符 
\p{Lu} 			大写字母(简单类别) 
\p{Sc} 			货币符号 
\P{InGreek} 	所有字符,Greek 块中的除外(否定) 
[\p{L}&&[^\p{Lu}]]  所有字母,大写字母除外(减去) 
  
边界匹配器 
^ 				行的开头 
$ 				行的结尾 
\b 				单词边界 
\B 				非单词边界 
\A 				输入的开头 
\G 				上一个匹配的结尾 
\Z 				输入的结尾,仅用于最后的结束符(如果有的话) 
\z 				输入的结尾 
  
Greedy 数量词 
X? 				X,一次或一次也没有 
X*				 X,零次或多次 
X+ 				X,一次或多次 
X{n}			 X,恰好 n 次 
X{n,}			 X,至少 n 次 
X{n,m}			 X,至少 n 次,但是不超过 m 次 
  
Reluctant 数量词 
X??				 X,一次或一次也没有 
X*? 			 X,零次或多次 
X+?				 X,一次或多次 
X{n}? 			 X,恰好 n 次 
X{n,}?			 X,至少 n 次 
X{n,m}?			 X,至少 n 次,但是不超过 m 次 
  
Possessive 数量词 
X?+ 			X,一次或一次也没有 
X*+ 			X,零次或多次 
X++				X,一次或多次 
X{n}+ 			X,恰好 n 次 
X{n,}+ 			X,至少 n 次 
X{n,m}+			X,至少 n 次,但是不超过 m 次 
  
Logical 运算符 
XY    			X 后跟 Y 
X|Y				 X 或 Y 
(X) 			X,作为捕获组 
  
Back 引用 
\n 				任何匹配的 nth 捕获组 
  
引用 
\ 				Nothing,但是引用以下字符 
\Q 				Nothing,但是引用所有字符,直到 \E 
\E 				Nothing,但是结束从 \Q 开始的引用 
  
特殊构造(非捕获) 
(?:X)			 X,作为非捕获组 
(?idmsux-idmsux)  Nothing,但是将匹配标志i d m s u x on - off 
(?idmsux-idmsux:X)   X,作为带有给定标志 i d m s u x on - off 
(?=X)       	X,通过零宽度的正 lookahead 
(?!X) 			X,通过零宽度的负 lookahead 
(?<=X) 			X,通过零宽度的正 lookbehind 
(?X) 			X,作为独立的非捕获组 

*/












这是IPA提供的正则表达式的规则。当然啦,有了规则,我们就得用这些规则,
正则表达式有几个常见的功能——判断功能、分割功能、替换功能以及获取功能;
判断功能:
  • String类的public boolean matches(String regex);
给定一个字符串,如果这个字符串符合给出的规则,放回true,否则返回false;


 判断功能例题 需求:
   判断手机号码是否满足要求?
  
  分析:
   A:键盘录入手机号码
   B:定义手机号码的规则
  •   13436975980
  •   13688886868
  •   13866668888
  •    13456789012
  •    13123456789
  •    18912345678
  •    18886867878
  •    18638833883
   C:调用功能,判断即可
   D:输出结果

import java.util.Scanner;


 */
public class RegexDemo {
	public static void main(String[] args) {
		//键盘录入手机号码
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你的手机号码:");
		String phone = sc.nextLine();
		
		//定义手机号码的规则
		String regex = "1[38]\\d{9}";
		
		//调用功能,判断即可
		boolean flag = phone.matches(regex);
		
		//输出结果
		System.out.println("flag:"+flag);
	}
}













例子:邮箱校正


  校验邮箱
 
  分析:

   A:键盘录入邮箱

   B:定义邮箱的规则

   [email protected]

   [email protected]

   [email protected]

   [email protected]

   [email protected]

   C:调用功能,判断即可

   D:输出结果

import java.util.Scanner;

public class RegexTest {
	public static void main(String[] args) {
		//键盘录入邮箱
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入邮箱:");
		String email = sc.nextLine();
		
		//定义邮箱的规则
		//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
		String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";
		
		//调用功能,判断即可
		boolean flag = email.matches(regex);
		
		//输出结果
		System.out.println("flag:"+flag);
	}
}







 








分割功能

String类的public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。 

 以下代码是一个搜索好友的性别和年龄设置:

  举例:
   百合网,世纪佳缘,珍爱网,QQ
   搜索好友
   性别:女
   范围:"18-24"
  
   age>=18 && age<=24
 



例子:

import java.util.Scanner;

public class RegexDemo {
	public static void main(String[] args) {
		//定义一个年龄搜索范围
		String ages = "18-24";
		
		//定义规则
		String regex = "-";
		
		//调用方法
		String[] strArray = ages.split(regex);
		
//		//遍历
//		for(int x=0; x=startAge && age<=endAge) {
			System.out.println("你就是我想找的");
		}else {
			System.out.println("不符合我的要求,gun");
		}
	}
}










 分割功能练习题一:

public class RegexDemo2 {
	public static void main(String[] args) {
		// 定义一个字符串
		String s1 = "aa,bb,cc";
		// 直接分割
		String[] str1Array = s1.split(",");
		for (int x = 0; x < str1Array.length; x++) {
			System.out.println(str1Array[x]);
		}
		System.out.println("---------------------");




		String s2 = "aa.bb.cc";
		String[] str2Array = s2.split("\\.");
		for (int x = 0; x < str2Array.length; x++) {
			System.out.println(str2Array[x]);
		}
		System.out.println("---------------------");




		String s3 = "aa    bb                cc";
		String[] str3Array = s3.split(" +");
		for (int x = 0; x < str3Array.length; x++) {
			System.out.println(str3Array[x]);
		}
		System.out.println("---------------------");
		
		//硬盘上的路径,我们应该用\\替代\
		String s4 = "E:\\JavaSE\\day14\\avi";
		String[] str4Array = s4.split("\\\\");
		for (int x = 0; x < str4Array.length; x++) {
			System.out.println(str4Array[x]);
		}
		System.out.println("---------------------");
	}
}


 

分割功能练习二:



 我有如下一个字符串:"91 27 46 38 50"
  请写代码实现最终输出结果是:"27 38 46 50 91"
  
  分析:
   A:定义一个字符串
   B:把字符串进行分割,得到一个字符串数组
   C:把字符串数组变换成int数组
   D:对int数组排序
   E:把排序后的int数组在组装成一个字符串
   F:输出字符串
 

import java.util.Arrays;

public class RegexTest {
	public static void main(String[] args) {
		// 定义一个字符串
		String s = "91 27 46 38 50";
		// 把字符串进行分割,得到一个字符串数组
		String[] strArray = s.split(" ");

		// 把字符串数组变换成int数组
		int[] arr = new int[strArray.length];

		for (int x = 0; x < arr.length; x++) {
			arr[x] = Integer.parseInt(strArray[x]);
		}

		// 对int数组排序
		Arrays.sort(arr);

		// 把排序后的int数组在组装成一个字符串
		StringBuilder sb = new StringBuilder();
		for (int x = 0; x < arr.length; x++) {
			sb.append(arr[x]).append(" ");
		}
		//转化为字符串
		String result = sb.toString().trim();
		
		//输出字符串
		System.out.println("result:"+result);
	}
}



替换功能

  String类的public String replaceAll(String regex,String replacement)  

 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 




import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
	public static void main(String[] args) {
		// 模式和匹配器的典型调用顺序
		// 把正则表达式编译成模式对象
		Pattern p = Pattern.compile("a*b");
		// 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
		Matcher m = p.matcher("aaaaab");
		// 调用匹配器对象的功能
		boolean b = m.matches();
		System.out.println(b);
		
		//这个是判断功能,但是如果做判断,这样做就有点麻烦了,我们直接用字符串的方法做
		String s = "aaaaab";
		String regex = "a*b";
		boolean bb = s.matches(regex);
		System.out.println(bb);
	}
}




练习例题:

public class RegexDemo {
	public static void main(String[] args) {
		// 定义一个字符串
		String s = "helloqq12345worldkh622112345678java";




		// 我要去除所有的数字,用*给替换掉
		// String regex = "\\d+";
		// String regex = "\\d";
		//String ss = "*";
		
		
		// 直接把数字干掉
		String regex = "\\d+";
		String ss = "";




		String result = s.replaceAll(regex, ss);
		System.out.println(result);
	}
}






获取功能

  Pattern和Matcher类的使用
  
  模式和匹配器的基本使用顺序

例子:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * 
 * 获取下面这个字符串中由三个字符组成的单词
 * da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
 */
public class RegexDemo2 {
	public static void main(String[] args) {
		// 定义字符串
		String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
		// 规则
		String regex = "\\b\\w{3}\\b";




		// 把规则编译成模式对象
		Pattern p = Pattern.compile(regex);
		// 通过模式对象得到匹配器对象
		Matcher m = p.matcher(s);
		/* 调用匹配器对象的功能
		 通过find方法就是查找有没有满足条件的子串
		 public boolean find()
		 boolean flag = m.find();
		 System.out.println(flag);
		 // 如何得到值呢?
		 public String group()
		 String ss = m.group();
		 System.out.println(ss);
		
		 再来一次
		 flag = m.find();
		 System.out.println(flag);
		 ss = m.group();
		 System.out.println(ss);
		*/
		while (m.find()) {
			System.out.println(m.group());
		}
		/*
		 注意:一定要先find(),然后才能group()
		 IllegalStateException: No match found
		 String ss = m.group();
		 System.out.println(ss);
		*/
	}
}




你可能感兴趣的:(java学习日记)