黑马程序员_JavaSE基础知识总结十九:正则表达式初步

------ android培训java培训、期待与您交流! ----------


一、概述和简单使用

正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。它其实就是一种规则,有自己特殊的应用。

1、不使用正则表达式校验陌陌号码


<span style="font-size:18px;color:#333333;">import java.util.Scanner;
/*
 * 需求:校验陌陌号码.
 *			1:要求必须是5-15位数字
 *			2:0不能开头
 */

public class RegexDemo {
        public static void main(String[] args) {
        	System.out.println("请输入您的陌陌号码,");
        	Scanner sc = new Scanner(System.in);
        	String momo = sc.nextLine();
        	boolean flag = checkMomo(momo);
        	if(flag==true){
        		System.out.println("你的陌陌是正确的");
        	}else{
        		
        		System.out.println("你输入的是陌陌号吗   ?????????");
        	}
		}

		private static boolean checkMomo(String momo) {
			// 如何验证
			boolean flag = true;
			//验证位数 5~15
			if(momo.length()>=5 && momo.length()<=15){
				//判断首位是不是0字符
				if(momo.charAt(0)=='0'){
					return false;
				}
				//做遍历
				for (int i = 0; i < momo.length(); i++) {
					//判断里面的元素是不是都是数字
					if(!Character.isDigit(momo.charAt(i))){
	                    return false;
					}	
				}
				
			}else{
				return false;
			}
			
			return flag;
		}
}</span>

2、使用正则表达式校验陌陌号码


<span style="font-size:18px;color:#333333;">import java.util.Scanner;
/*
 * 需求:校验陌陌号码.
 *			1:要求必须是5-15位数字
 *			2:0不能开头
 */

public class RegexDemo {
        public static void main(String[] args) {
        	System.out.println("请输入您的陌陌号码,");
        	Scanner sc = new Scanner(System.in);
        	String momo = sc.nextLine();
        	boolean flag = checkMomo(momo);
        	String regex = "[1-9]\\d{4,14}";	
        	boolean flag = momo.matches(regex);
        	if(flag==true){
        		System.out.println("你的陌陌是正确的");
        	}else{
        		
        		System.out.println("你输入的是陌陌号吗   ?????????");
        	}
		}
</span>



二、正则表达式的组成规则

1、字符

x 字符 x。              举例:  "a"表示字符a

\\ 反斜线字符。         "\\"  -->需要匹配的内容是\ 两个\\表示一个\

\n 新行(换行)符       "\n" 换行符

\r 回车符               "\r" 回车符

 

2、字符类

[abc] a、b 或 c(简单类)                             

"[abc]"需要匹配的内容得是字符a或b或c 的一个

[^abc] 任何字符,除了 a、b 或 c(否定)                

"[^abc]" 除了字符a或b或c的任意一个字符

[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)    

"[a-zA-Z] "表示规则是一个字符规则可以是所有字母.

 [a-zA-Z_0-9]  表示匹配的时候呢,数字,字母还有下划线都可以  

 

3、单词字符

[0-9] 0到9的字符都包括                                

"[0-9]"表示匹配0~9之间的数字包括0,9

 

4、预定义字符类                             

. 任何字符。我的就是.字符本身,怎么表示呢? \.        "." 

\d 数字:[0-9]                                      "\\d"

\w 单词字符:[a-zA-Z_0-9]                             

表示匹配所有字母+数字+下划线

 

5、边界匹配器

^行的开头                                             

^[abc][0-9]$ 需要匹配的内容从[abc]这个位置开始, 相当于左双引号

$ 行的结尾                                                       

需要匹配的内容从[0-9]这个位置结束, 相当于右双引号

\b 单词边界                                             

 \b[a-z]\b 代表字母a,或b,或c 左右两边需要的是非单词字符

 

6、Greedy 数量词 

X?   X,一次或一次也没有                                

  "a?" 需要匹配的内容是对应的一个字符a,或者没有

X*   X,零次或多次                                     

  "a*" 需要匹配的内容是多个字符a或一个都没有

X+   X,一次或多次                                    

   "a+" 需要匹配的内容是多个字符a或一个a

  X{n}     X,恰好 n 次                                  

  "a{5}"需要匹配5次a字符         

 "a"--恰巧一次 "a{1}"

X{n,}   X,至少 n 次                                    

 "a{5,}"最少5次,不设置上限

X{n,m}   X,至少 n 次,但是不超过 m 次                     

 "a{5,8}"最少5次,最多8次

 


三、正则表达式的判断功能

1、案例一:验证电话号码

<span style="font-size:18px;color:#333333;">import java.util.Scanner;

/*
 * 	A:正则表达式的判断功能
		String类的功能:public boolean matches(String regex)
		
		拿到你要判断字符串,字符串调用此功能,去和你之前定义好的规则进行匹配
		那定义好的规则是什么呢?就是你传递的那个参数  regex
		这个参数就是你要定义的规则
	B:案例演示
		正则表达式的判断功能
              验证电话号码
            1:拿到要判断字符串
            2:定义规则
            3:调方法进行匹配判断   得到判断的返回值
            

 */

public class RegexDemo2 {
     public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入电话号码,我来帮你查询位置在哪里:");
		String line = sc.nextLine();
		//定义规则
		String regex ="1[356789][0-9]{9}";
		//使用规则匹配
		//public boolean matches(String regex)
		//通过String中的matches方法进行匹配
		boolean flag = line.matches(regex);
		if (flag) {
			System.out.println("这个号码是中国的,很安全");
		} else {
            System.out.println("这个号码有隐患,你要买保险!还有安利!");
		}
	}            
}</span>

2、案例二:校验邮箱

<span style="font-size:18px;color:#333333;">package cn.itcast_regextest;
/*
 * 验证邮箱:
 *     spt@itcast.cn
 *     65545645@qq.com
 *     aaa@Hotmail.com
 *     taicaiyingmu@sina.com.cn
 *     sk_work@126.com 
 *    分析:验证规则
 *        [a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-z]+)+
 *     三步:
 *       1:接收字符串(传过来的邮箱地址)
 *       2:写规则
 *       3:做判断
 */
public class RegexTest {
      public static void main(String[] args) {
		  //接收邮箱
    	  String mail  = "@123.com.cn";
    	  //写验证邮箱的规则
    	  String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-z]+)+";
    	  //根据规则匹配验证
    	  boolean flag = mail.matches(regex);
    	  if (flag) {
			System.out.println("登陆成功,发邮件吧");
    	  }else {
			System.out.println("邮箱有问题:买保险吧,还有安利!");
    	  }
	  }
}</span>



四、正则表达式的分割功能

1、案例一:对字符串分割并排序

<span style="font-size:18px;color:#333333;">import java.util.Arrays;

/*
 * 	
		需求:我有如下一个字符串:”91 27 46 38 50”,
		请写代码实现最终输出结果是:”27 38 46 50 91”
	分析: 
	   1:定义一个字符串
	   2:定义规则,对字符串进行切割
	   3:切割完之后得到了字符串数组,字符串数组可不可以排序
	   4:排完序输出
	   
 */
public class RegexTest2 {
	    public static void main(String[] args) {
	    	//定义一个字符串
            String str = "91 27 46 38 50";
            //定义规则 对字符串进行切割
            //String regex = " ";
            String[] split = str.split(" ");
            System.out.println(Arrays.toString(split));
            //对字符串数组排序
            Arrays.sort(split);
            //System.out.println(Arrays.toString(split));
            for (int i = 0; i < split.length; i++) {
				//split[i]
            	System.out.print(split[i]+" ");
			}
            System.out.println();
		}
}</span>

2、分割IP

<span style="font-size:18px;color:#333333;">import java.util.Arrays;

/*
 * A:正则表达式的分割功能
		String类的功能:public String[] split(String regex)
		    按照你写好的规则进行分割,分割出来的结果是一个字符串数组		       
	怎么对字符串进行切割?
	   1:指定要切割的字符串
	   2:指定切分规则正则表达式
	   3:使用规则进行切割
		
 */
public class RegexDemo3 {
       public static void main(String[] args) {
		   //指定了要切割的字符串  
    	   //String  momo = "18 20 24 25";//将来切割完之后 age>=18 && age<=24
    	   String  ip = "192.168.35.83";
    	   //写规则
    	   String regex = "\\.";//按照什么规则进行切割
    	   //规则就是按照什么字符去
    	   //按照规则切割
    	   String[] strings = ip.split(regex);
    	   
    	   System.out.println(Arrays.toString(strings));
		     
	   }
}</span>



五、正则表达式的替换功能

<span style="font-size:18px;color:#333333;">package cn.itcast_regextest;
/*
 * 	正则表达式的替换功能
  String类的功能:
   public String replaceAll(String regex,String replacement)
	 把对应的该字符串中满足正则表达式部分的数据内容使用给定的新字符串所替换,返回的是替换后的新字符串。
		正则表达式的替换功能
            论坛中不能出现数字字符,用*替换
            
            1:先写一个论坛中出现的字符串
            2:定义一个需要替换规则
            3:使用规则,进行替换
            4:替换完再输出
 */
public class RegexTest3 {
        public static void main(String[] args) {
			String aa = "huluwa奥巴马shejing3333";
			//写一个替换的规则
			String regex = "奥巴马";
			//要替换的是什么
			String replacement = "*";
			
			//将输入的字符串进行过滤
			String replaceAll = aa.replaceAll(regex, replacement);
		    System.out.println(replaceAll);
        }
}</span>



六、正则表达式的获取功能

 

1、Pattern和Matcher的概述

模式和匹配器的典型调用顺序是:

Pattern p = Pattern.compile("a*b");

Matcher m = p.matcher("aaaaab");

boolean b = m.matches();

 

2、案例

<span style="font-size:18px;color:#333333;">import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * A:正则表达式的获取功能
		Pattern和Matcher的结合使用
	B:案例演示
		需求:获取下面这个字符串中由三个字符组成的单词
		da jia ting wo shuo,jin tian yao xia yu,bu 
		shang wan zi xi,gao xing bu?
    Matcher:
        public boolean find()
        public String group()返回由以前匹配操作所匹配的输入子序列。 
           
 */
public class RegexTest4 {
       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 regex = "\\b[a-zA-Z]{3}\\b";
		//使用规则,获取满足条件的字符串
		//把正则表达式编译成Pattern对象
		Pattern p = Pattern.compile(regex);
		//获取匹配器
		Matcher m = p.matcher(str);
		
		//判断我的str中有没有符合规则的字符单词
        while(m.find()){
        	System.out.println(m.group());
        }
       }		
}</span>










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值