文章目录 一、正则表达式概述二、正则表达式的匹配规则三、正则表达式在方法中的应用3.1 校验手机号、邮箱和座机电话号码3.2 字符串的内容替换和分割 四、编程题目4.1 表示数值的字符串4
正则表达式是对字符串(包括普通字符(例如:a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
简而言之,正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
匹配方法:
字符类(默认匹配一个字符): 预定义的字符类(默认匹配一个字符):
贪婪的量词(配合匹配多个字符):
注:X 代表前两框的字符类。
举例:
public class RegexDemo01 { public static void main(String[] args) { //public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true // 只能是 a b c System.out.println("a".matches("[abc]")); // true System.out.println("z".matches("[abc]")); // false System.out.println("---------------------------------"); // 不能出现 a b c System.out.println("a".matches("[^abc]")); // false System.out.println("z".matches("[^abc]")); // true System.out.println("---------------------------------"); System.out.println("a".matches("\\d")); // false System.out.println("3".matches("\\d")); // true System.out.println("333".matches("\\d")); // false 因为只匹配一个字符,多个字符直接就 false System.out.println("z".matches("\\w")); // true System.out.println("2".matches("\\w")); // true System.out.println("21".matches("\\w")); // false 因为只匹配一个字符,多个字符直接就 false System.out.println("你".matches("\\w")); //false System.out.println("你".matches("\\W")); // true System.out.println("---------------------------------"); // 以上正则匹配只能校验单个字符。 // 校验密码 // 必须是数字 字母 下划线 至少 6位 System.out.println("2442fsfsf".matches("\\w{6,}")); // true System.out.println("244f".matches("\\w{6,}")); //false // 验证码 必须是数字和字符 必须是4位 System.out.println("23DF".matches("[a-zA-Z0-9]{4}")); // true System.out.println("23_F".matches("[a-zA-Z0-9]{4}")); //false System.out.println("23dF".matches("[\\w&&[^_]]{4}")); // true System.out.println("23_F".matches("[\\w&&[^_]]{4}")); //false }}
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-3572457 0273572457 if(tel.matches("0\\d{2,6}-?\\d{5,20}")){ System.out.println("格式正确,注册完成!"); break; }else { System.out.println("格式有误!"); } } }}
举例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}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})"; // 2、把这个爬取规则编译成匹配对象。 Pattern pattern = Pattern.compile(regex); // 3、得到一个内容匹配器对象 Matcher matcher = pattern.matcher(rs); // 4、开始查找 while (matcher.find()) { String rs1 = matcher.group(); System.out.println(rs1); } }}
剑指 Offer 20. 表示数值的字符串:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/
题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
小数(按顺序)可以分成以下几个部分:
整数(按顺序)可以分成以下几个部分:
部分数值列举如下:
["+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 " |
---|---|---|---|---|
输出 | true | false | false | true |
代码实现:
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); }}
题目描述:
输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列长度。
比如:12234 属于非严格递增数字序列
输入描述:输入一个字符串仅包含大小写字母和数字
输出描述: 输出字符串中包含的最长的非严格递增连续数字序列长度
用例:
输入 | abc2234019A334bc | abc02a234019A334bc |
---|---|---|
输出 | 4 | 3 |
本题思路:
通过正则表达式,分割字符串中的数字部分,再使用滑动窗口算法解决递增序列问题。
代码实现:
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真题)
来源地址:https://blog.csdn.net/weixin_43819566/article/details/131320764
--结束END--
本文标题: Java 基础进阶篇(十八):正则表达式匹配规则和应用
本文链接: https://www.lsjlt.com/news/409686.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-03
2024-04-03
2024-04-01
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0