文章目录

  • 一、正则表达式概述
  • 二、正则表达式的匹配规则
  • 三、正则表达式在方法中的应用
    • 3.1 校验手机号、邮箱和座机电话号码
    • 3.2 字符串的内容替换和分割
  • 四、编程题目
    • 4.1 表示数值的字符串
    • 4.2 非严格递增连续数字序列

一、正则表达式概述

  正则表达式是对字符串(包括普通字符(例如:a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

简而言之,正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。


二、正则表达式的匹配规则

匹配方法:

字符类(默认匹配一个字符):                预定义的字符类(默认匹配一个字符):

贪婪的量词(配合匹配多个字符):

注:X 代表前两框的字符类。

举例:

public class RegexDemo01 {public static void main(String[] args) {//public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true// 只能是 abcSystem.out.println("a".matches("[abc]")); // trueSystem.out.println("z".matches("[abc]")); // falseSystem.out.println("---------------------------------");// 不能出现 abcSystem.out.println("a".matches("[^abc]")); // falseSystem.out.println("z".matches("[^abc]")); // trueSystem.out.println("---------------------------------");System.out.println("a".matches("\\d")); // falseSystem.out.println("3".matches("\\d")); // trueSystem.out.println("333".matches("\\d")); // false 因为只匹配一个字符,多个字符直接就 falseSystem.out.println("z".matches("\\w")); // trueSystem.out.println("2".matches("\\w")); // trueSystem.out.println("21".matches("\\w")); // false 因为只匹配一个字符,多个字符直接就 falseSystem.out.println("你".matches("\\w")); //falseSystem.out.println("你".matches("\\W")); // trueSystem.out.println("---------------------------------");//以上正则匹配只能校验单个字符。// 校验密码// 必须是数字 字母 下划线 至少 6位System.out.println("2442fsfsf".matches("\\w{6,}")); // trueSystem.out.println("244f".matches("\\w{6,}")); //false// 验证码 必须是数字和字符必须是4位System.out.println("23dF".matches("[a-zA-Z0-9]{4}")); // trueSystem.out.println("23_F".matches("[a-zA-Z0-9]{4}")); //falseSystem.out.println("23dF".matches("[\\w&&[^_]]{4}")); // trueSystem.out.println("23_F".matches("[\\w&&[^_]]{4}")); //false}}

三、正则表达式在方法中的应用

3.1 校验手机号、邮箱和座机电话号码

public class RegexDemo02 {public static void main(String[] args) {// 校验手机号码 邮箱 电话号码checkPhone();checkEmail();checkTel();}// 校验手机号public static void checkPhone(){Scanner sc = new Scanner(System.in);while(true){System.out.print("输入手机号:");String phone = sc.next();// 判断手机号的格式是否正确if(phone.matches("1[3-9]\\d{9}")){System.out.println("成功!");break;}else{System.out.println("失败!");}}}// 校验邮箱public static void checkEmail(){Scanner sc = new Scanner(System.in);while (true) {System.out.print("请您输入您的注册邮箱:");String email = sc.next();// 判断邮箱格式是否正确 3268847878@qq.com// 判断邮箱格式是否正确 3268847dsda878@163.com// 判断邮箱格式是否正确 3268847dsda878@pci.com.cn// "."代表任何字符,"\\."等同于 \. 是纯 .if(email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){System.out.println("邮箱格式正确,注册完成!");break;}else {System.out.println("格式有误!");}}}// 校验电话号码(座机)public static void checkTel(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请您输入您的电话号码:");String tel = sc.next();// 判断电话号码格式是否正确 027-35724570273572457if(tel.matches("0\\d{2,6}-" />)){System.out.println("格式正确,注册完成!");break;}else {System.out.println("格式有误!");}}}}

3.2 字符串的内容替换和分割

举例1:在字符串中寻找姓名

public class RegexDemo03 {public static void main(String[] args) {String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";String[] arrs = names.split("\\w+");for (int i = 0; i < arrs.length; i++) {System.out.println(arrs[i]); // 小路 蓉儿 小何}String str = names.replaceAll("\\w+", "**");System.out.println(str); // 小路**蓉儿**小何String[] strArr = str.split("\\*\\*");for (int i = 0; i < strArr.length; i++) {System.out.println(strArr[i]);}}}

举例2:正则表达式爬取信息中的内容

public class RegexDemo04 {public static void main(String[] args) {String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +"itcast@itcast.cn,电话18762832633,0203232323" +"邮箱bozai@itcast.cn,400-100-3233 ,4001003232";// 需求:从上面的内容中爬取出 电话号码和邮箱。// 1、定义爬取规则,字符串形式String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|"+"(0\\d{2,6}-" />;// 2、把这个爬取规则编译成匹配对象。Pattern pattern = Pattern.compile(regex);// 3、得到一个内容匹配器对象Matcher matcher = pattern.matcher(rs);// 4、开始查找while (matcher.find()) {String rs1 = matcher.group();System.out.println(rs1);}}}

四、编程题目

4.1 表示数值的字符串

剑指 Offer 20. 表示数值的字符串:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选) 一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选) 一个符号字符( ‘+’ 或 ‘-’ )
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 ‘.’
    2. 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    3. 一个点 ‘.’ ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选) 一个符号字符(‘+’ 或 ‘-’)
  2. 至少一位数字

部分数值列举如下:

["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

用例:

输入s = “0”s = “e”s = “.”s = ” .1 “
输出truefalsefalsetrue

代码实现:

class Solution {public boolean isNumber(String s) {// 去除首尾空格s = s.trim();return isDecimal(s) || isInteger(s);}/** * 判断是否是小数 */public boolean isDecimal(String s){//(可选)一个符号字符('+' 或 '-')// 下述格式之一://至少一位数字,后面跟着一个点 '.'//至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字//一个点 '.' ,后面跟着至少一位数字String regx1 = "[+-]{0,1}[0-9]{1,20}\\.[0-9]{0,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";String regx2 = "[+-]{0,1}\\.[0-9]{1,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";return s.matches(regx1) || s.matches(regx2);}/** * 判断是否是整数 */public boolean isInteger(String s){//(可选)一个符号字符('+' 或 '-')//至少一位数字String regx1 = "[+-]{0,1}[0-9]{1,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";return s.matches(regx1);}}

4.2 非严格递增连续数字序列

题目描述:

输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列长度。

比如:12234 属于非严格递增数字序列

输入描述:输入一个字符串仅包含大小写字母和数字

输出描述: 输出字符串中包含的最长的非严格递增连续数字序列长度

用例:

输入abc2234019A334bcabc02a234019A334bc
输出43

本题思路:

通过正则表达式,分割字符串中的数字部分,再使用滑动窗口算法解决递增序列问题。

代码实现:

public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();String[] nums = str.split("[a-zA-Z]{1,}");// ["", "02", "234019", "334"]int maxLen = 0;for(int i = 0; i < nums.length; i ++){if(!nums[i].isEmpty()){maxLen = Math.max(maxLen, getNumsLength(nums[i]));}}System.out.println(maxLen);}// abc02a234019A334bc// 滑动窗口求最大长度public static int getNumsLength(String num){int sum = 1;int start = 0;for(int end = 1; end < num.length(); end ++){char ch = num.charAt(end);if(ch - num.charAt(end-1) >= 0){sum = Math.max(sum, end-start+1);}else{start = end;}}return sum;}}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)