正则表达式

本文介绍了正则表达式的基本概念、规则和在Java中的使用,包括匹配、替换、分割等操作。重点讲解了字符类、量词、边界字符以及分组的概念,并提供了正则表达式验证QQ号码的例子。
摘要由CSDN通过智能技术生成

验证qq号码是否符合规则
1.必须是5-10位
2.0不可以作为qq号的开头

package com.sxt.regexdemo;

import java.util.Scanner;


public class RegexDemo01 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个QQ号:");
		
		String qq = input.next();
		
		if (checkQQByRegex(qq)) {
			System.out.println("合法QQ");
		} else {
			System.out.println("非法QQ");
		}

	}

	public static boolean checkQQ(String qq) {

		boolean flag = true;

		// 保证5-10位
		if (qq.length() >= 5 && qq.length() <= 10) {
			// 保证不是0开头
			if (!qq.startsWith("0")) {
				// 保证是数字
				char[] chs = qq.toCharArray();
				for (int i = 0; i < chs.length; i++) {
					char c = chs[i];
					if (!(c >= '0' && c <= '9')) {
						flag = false;
						break;
					}
				}
			} else {
				flag = false;
			}
		} else {
			flag = false;
		}
		return flag;
	}

	public static boolean checkQQByRegex(String qq) {
		return qq.matches("[1-9]\\d{4,9}");
	}

}
正则表达式:
  • 正则表达式的规则

  • 概念: 使用单个字符串来描述/匹配一系列符合某个语法规则的字符串

  • 在Java里面来学习正则表达式的目

  • 主要就是使用正则表达式来处理字符串复杂的查找 find/替换replace/匹配matches/分割split工作

  • boolean matches(String regex) 匹配matches

  • String replaceFirst(String regex, String replacement) 替换replace

  • String replaceAll(String regex, String replacement) 替换replace

  • String[] split(String regex) 分割split工作

  • String[] split(String regex, int limit) 分割split工作

  • Pattern 正则表达式类

  • Matcher 匹配器类 查找 find

  • 使用步骤

  • 1.通过大量的字符串找规律定义规则

  • 2.使用这种规则去匹配新的字符串

  • 3.匹配成功作出相应的操作(匹配 查找 替换 分割)

  • 工具: https://regexper.com/

  • 正则表达式由两种基本字符组成
    原义字符:字符本身就是一个正则表达式,例如 a, b, c ,\t ,\n ,\r ,\f等等
    元字符: * + ? $ ^ () [] {}等等

    对正则表达式进行分类
    字符类: [abc] 将字符进行归类,可以出现[]中的其中一个 对abc其中一个进行匹配
    范围类:
    [a-z] 表示代表a-z中的一个字符
    表示所有的英文字母和数字 [a-zA-Z0-9]
    预定义类:
    \d == [0-9] 数字
    \D == [^0-9] 非数字
    空白字符:[ \t\n\x0B\f\r] == \s

    [^ \t\n\x0B\f\r] == \S
    [a-zA-Z0-9] \w
    [^a-zA-Z0-9] \W
    . 任何字符(与行结束符可能匹配也可能不匹配) 
    

    边界字符
    ^:以XXX开头
    例如以a开头 ^a
    : 以 X X X 结 尾 例 如 以 b 结 尾 b :以XXX结尾 例如以b结尾 b :XXXbb
    \b:单词边界: 连续数字和字母的两边
    \B:非单词边界

    量词
    ?:出现0次或者1次
    a?
    +:出现1次或者多次
    a+
    :出现任意次
    a

    {n}:出现正好n次
    a{4}
    {n,m}出现n-m次
    a{2,6}
    {n,}出现至少n次
    a{3,}
    分组 ()
    如何让Jack出现至少3次,而不是k出现三次
    错误写法 Jack{3,}
    使用分组的正确写法: (Jack){3,}
    忽略分组:每一组能够分组,但是没有编号 ?:
    (Jack){3,}(?:love){2,}(work){3,}

    或 |
    Ja(ck|Love)Kitty

package com.sxt.regexdemo;

public class RegexDemo02 {
	public static void main(String[] args) {
		String s = "http://abc aaaABCDEFG	 123 [ xyz ().java";
		String regex = "\\b";
		System.out.println(s.replaceFirst(regex, "X"));
		System.out.println(s.replaceAll(regex, "X"));
		System.out.println(s.replaceAll(regex, "X"));
		System.out.println(s.replaceAll(regex, "X"));
		System.out.println(s.replaceAll(regex, "X"));
		System.out.println(s.replaceAll(regex, "X"));
		
		String s2 = "aaaxyz133";
		String regex = "a{4,}xyz1?334?";
		System.out.println(s2.matches(regex));
		
		String s3 = "jackjacklovegirlfriend";
		String regex = "(jack){2}love(?:girl)(friend)";
		System.out.println(s3.matches(regex));
		
		String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
		String s = "2018-04-27";
		System.out.println("原日期字符串:" + s);
		String replace = s.replaceAll(regex, "$2/$3/$1");
		System.out.println("使用正则修改后的日期字符串:" + replace);
		
		String regex = "Ja(ck|Love)Kitty";
		String s = "JaLoveKitty";
		System.out.println(s.matches(regex));
	}
}
  • 正则表达式在Java当中的应用
  • 主要就是使用正则表达式来处理字符串复杂的查找 find/替换replace/匹配matches/分割split工作
  • boolean matches(String regex) 匹配matches
  • String replaceFirst(String regex, String replacement) 替换replace
  • String replaceAll(String regex, String replacement) 替换replace
  • String[] split(String regex) 分割split工作
  • String[] split(String regex, int limit) 分割split工作
  • Pattern 正则表达式类
  • Matcher 匹配器类 查找 find
package com.sxt.regexdemo;

import java.util.Arrays;

public class RegexDemo03 {
	public static void main(String[] args) {
		String src = "abc123xxdakjdka";
		String regex = "[a-c]{3}\\d{3}x{2}";
		System.out.println(src.matches(regex));

		System.out.println(src.replaceAll(regex, "X"));

		String src2 = "abc123efghid43opq";
		String regex2 = "\\d+";
		String[] strs = src2.split(regex2);
		// System.out.println(Arrays.toString(strs));
		for (int i = 0; i < strs.length; i++) {
			System.out.println(strs[i]);
		}
		System.out.println("--------------");
		String[] strs2 = src2.split(regex2, 1);
		System.out.println(Arrays.toString(strs2));

		final String str1 = "HelloWorld";
		final String str2 = "Hello" + "World";
		System.out.println(str1 == str2);// true
		final String str3 = "Hello" + String.valueOf("World");
		/*
		 *  Object obj = "World";
		 *  public static String valueOf(Object obj) {
		        return (obj == null) ? "null" : obj.toString();
		    }
		    
		    public String toString() {
		        return this;
		    }
		 */
		System.out.println(str1 == str3);// false
		
		

	}
}
  • Pattern 正则表达式类
  • Matcher 匹配器类
  • 查找 find
  • 1.先将正则表达式字符串编译成正则表达式对象
  • 2.通过正则表达式对象创建匹配器对象
  • 3.通过匹配器对象去做相应的字符串处理操作
package com.sxt.regexdemo;

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo04 {
	public static void main(String[] args) {
		String src = "acd12345";
		String regex = "[a-z]{3}\\d+";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(src);
		System.out.println(m.matches());
		System.out.println(m.replaceAll("haha"));
		System.out.println(Arrays.toString(p.split(src)));
		
		
	}
}

On Friendship And a youth said, "Speak to us of Friendship." Your friend is your needs answered. He is your field which

  • 获取两个字符组成的单词并且输出
package com.sxt.regexdemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo05 {
	public static void main(String[] args) {
		String s = "On Friendship And a youth said, \"Speak to us of Friendship.\" Your friend is your needs answered. He is your field which";
		
		// 定义规则
		String regex = "(\\b[a-zA-Z]{2}\\b)";
		
		// 根据正则编译生成模型对象
		Pattern p = Pattern.compile(regex);
		
		// 根据模型对象来创建匹配器
		Matcher m = p.matcher(s);
		
		System.out.println(m.find());
		System.out.println(m.start() + "|" + m.end());
		System.out.println(s.substring(m.start(),m.end()));
		System.out.println(m.group());
		
		System.out.println(m.find());
		System.out.println(m.group());
		
		while (m.find()) {
			System.out.println(m.group());
		}
		
	}
}

练习题:
比较手机号码

package com.sxt.practice01;

import java.util.Scanner;

/*
 * 验证手机号
 * 
 * 匹配如下四个手机号
 *  18079243050
 *  15160869850
 *  18765068050
 *  14235452850
 *  
 *  找规则:
 *  	1.以1开头
 *  	2.一共11位
 *  	3.50结尾
 *  	4.倒数第三位是 0 或者 8
 */
public class Practice01 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("请输入手机号码:");
		String number = input.next();
		String regex = "^1\\d{7}[08](50)$";
		System.out.println(number.matches(regex));
	}
}

把小写字母变成大写

package com.sxt.practice01;

/*
*	He is a man
	This is a boy
	is that your car?
	isn’t it?
	What is your name?
	将is替换替换成大写的IS
*/
public class Practice02 {
	public static void main(String[] args) {
		String src = "He is a man\r\n" + 
				"	This is a boy\r\n" + 
				"	is that your car?\r\n" + 
				"	isn’t it?\r\n" + 
				"	What is your name?";
		
		String regex = "\\bis\\b";
		String result = src.replaceAll(regex, "IS");
		System.out.println(result);
	}
}

日期替换

ackage com.sxt.practice01;

/*
 * 日期替换
	2016/03/05
	demo/07/ss
	1993/08/05
	2016/11/24
	12345/23/45678
	12345/24/3356
	1993-08-05
	将正确的日期格式替换为03-05-2016
 */
public class Practice03 {
	public static void main(String[] args) {
		String src = "2016/03/05\r\n" + 
				"	demo/07/ss\r\n" + 
				"	1993/08/05\r\n" + 
				"	2016/11/24\r\n" + 
				"	12345/23/45678\r\n" + 
				"	12345/24/3356\r\n" + 
				"	1993-08-05";
		String regex = "\\b(\\d{4})[/-](\\d{2})[/-](\\d{2})\\b";
		String result = src.replaceAll(regex, "$2-$3-$1");
		System.out.println(result);
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值