正则表达式

news/2025/2/12 15:07:44/

在这里插入图片描述

文章目录

  • 一、正则初体验
  • 二、匹配规则
  • 三、字符串方法的使用

一、正则初体验

正则表达式是特殊的字符序列,利用事先定义好的特定字符以及他们的组合组成了一个规则,然后检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。
在这里插入图片描述
比如我们的QQ登录页面,我们需要校验扣扣号码是否正确,我们规定QQ号 6 - 15位,并且全部为数字。
我们先用我们之前所学习的知识进行校验。

public static void main(String[] args) {//需求: 检验一个QQ号是否正确System.out.println(checkQQ("1054645664"));System.out.println(checkQQ("sad1245"));System.out.println(checkQQ(".,45545"));}public static boolean checkQQ(String qq) {//判断长度是否合法if(qq == null || qq.length() < 6 || qq.length() > 15) {return false;}//判断是否全部为数字for (int i = 0; i < qq.length(); i++) {char ch = qq.charAt(i);if(ch < '0' || ch > '9') {return false;}}return true;}

在这里插入图片描述
我们再来感受一下正则表达式是怎么判断的。

public static void main(String[] args) {//需求: 检验一个QQ号是否正确System.out.println(checkQQ1("1054645664"));System.out.println(checkQQ1("sad1245"));System.out.println(checkQQ1(".,45545"));}public static boolean checkQQ1(String qq) {return qq != null && qq.matches("\\d{6,20}");}

在这里插入图片描述
看到这里我们就能感受到正则表达式的作用了,正则表达式是字符串处理的有力工具。

二、匹配规则

字符类(默认匹配一个字符)

正则表达式作用
[abc]只能是a,b,c
[^abc]除了a,b,c之外的任何字符
[a-zA-Z]a - z , A - Z(范围)
[a-d[m-p]]a到d,或m到p]
[a-z&&[def]]d,e或者f
[a-z&&[^bc]]a到z,除了b,c
[a-z&&[^m-p]]a到z,除了m到p

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

正则表达式作用
.任何字符
\d一个数字
\D非数字
\s一个空白字符(\t\n\x0B\f\r)
\S非空白字符
\w[a-zA-Z_0-9]英文,数字,下划线
\W[^\w]非英文,数字下划线

量词(匹配多字符)

正则表达式作用
X?一次或根本不
X*零次或多次
X+一次或多次
X{n}刚好n次
X{n,}至少n次
X{n,m}至少n,不超过m

我们在使用时,往往都是上面三种一起使用的。
我们字符串对象为我们提供了一个匹配正则表达式规则的API

public boolean matches(String regex);

在这里插入图片描述
如果匹配正则表达式返回true,否则返回false.
我们现在试着用正则表达式来校验一下密码是否正确,密码必须是数字,字母,下划线,8-16位。

public static void main(String[] args) {System.out.println("sadasd44".matches("\\w{8,16}"));//正确的密码System.out.println("221244".matches("\\w{8,16}"));//位数不够System.out.println("s,asdasd44".matches("\\w{8,16}"));//非法字符}

在这里插入图片描述
在这里插入图片描述
我们刚才在学习正则表达式的时候,我们表示数字,字母下划线的时候是用\w表示的,为什么我们在书写的时候用的是\w?
因为我们java种\是个很特殊的字符,我们先不加试试看

在这里插入图片描述
报了一个字符串种存在非法转义字符,我们\w,的目的是将\转义为一个真正意义上的.

那如果我们的密码校验规则现在只允许出现数字字母,我们该怎么校验呢?因为\w是包含下划线的,我们先使用另一种方法。

public static void main(String[] args) {System.out.println("asdas244".matches("[a-zA-Z0-9]{8,16}"));System.out.println("as__s244".matches("[a-zA-Z0-9]{8,16}"));}

在这里插入图片描述
那我们要想用\w,我们可以去除_这个字符

public static void main(String[] args) {System.out.println("asdas244".matches("\\w&&^_{8,16}"));System.out.println("as__s244".matches("\\w&&^_{8,16}"));}

在这里插入图片描述
我们可以发现,我们和上面得到的结果不一致,既然出错了,肯定是我们的使用方式不对。
在这里插入图片描述
我们可以发现,在使用&&非操作时,需要把非括号括起来

public static void main(String[] args) {System.out.println("asdas244".matches("[\\w&&[^_]]{8,16}"));System.out.println("as__s244".matches("[\\w&&[^_]]{8,16}"));}

在这里插入图片描述
当我们改正后,达到了预期的效果。

三、字符串方法的使用

方法名说明
replaceAll(String s,String news)按照正则表达式进行替换
spilt(String s)按照正则表达式进行分割,返回字符串数组
public static void main(String[] args) {String names = "张三asdasd李四142王五";String[] arr = names.split("\\w+");for (String s : arr) {System.out.print(s+" ");}}

在这里插入图片描述
之前我们学过一个替换空格的问题。

public static void main(String[] args) {String s = "a    b  c   d";String[] s1 = s.split(" ");for (String s2 : s1) {System.out.print(s2+" ");}}

在这里插入图片描述
我们可以发现我们分割空格的话,并没有达到我们预期的效果,这里我们可以使用正则表达式的方式进行分割。

public static void main(String[] args) {String s = "a    b  c   d";String[] s1 = s.split("\\s+");for (String s2 : s1) {System.out.print(s2+" ");}}

在这里插入图片描述

public static void main(String[] args) {String names = "张三asdasd李四142王五";String s = names.replaceAll("\\w+", " ");System.out.println(s);}

在这里插入图片描述


http://www.ppmy.cn/news/3693.html

相关文章

【论文阅读】inception v1学习总结

【论文阅读总结】inception v1总结1. 摘要2. 序言3. 文献综述4.动机和高层考虑4.1提高深度神经网络性能的最直接方法4.1.1 增加模型的大小4.1.2 解决增加模型大小导致的缺点思路5.结构详述5.1 Inception架构的主要思想5.2 原生inception块问题5.3 解决通道数增加问题5.4 1*1卷积…

特殊符号——双引号和单引号

特殊符号——双引号和单引号一.通常理解二.一般使用三.特殊使用四.为何计算机需要字符一.通常理解 在c语言中&#xff0c;我们通常认为双引号保存的是字符串&#xff0c;单引号里保存的是字符。这里也没什么好说的&#xff0c;说一说它们的细微的一些地方 二.一般使用 接下来我…

华为机试 - 找到比自己强的人数

题目描述 给定数组[[2,1],[3 2]],每组表示师徒关系,第一个元素是第二个元素的老师,数字代表排名,现在找出比自己强的徒弟。 输入描述 无 输出描述 无 用例 输入[[2,1],[3,2]]输出[0,1,2]说明输入: 第一行数据[2,1]表示排名第 2 的员工是排名第 1 员工的导师,后面的数据…

ElasticSearch 调优

第一部分&#xff1a;调优索引速度 第二部分&#xff1a;调优搜索速度 第三部分&#xff1a;通用的一些建议 英文原文&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/how-to.html ES发布时带有的默认值&#xff0c;可为es的开箱即用带来很好的…

2023年pmp的考试时间是什么时候?

PMP 考试一年是有四次考试&#xff0c;分别是 3 月、6月、9月、12月&#xff0c;不出意外的话就是这几个月了&#xff0c;提前 2 个月开始报名&#xff0c;但还是要关注PMI/基金会官网的信息&#xff0c;以官网的消息为准。 一、报考条件 报考条件其实挺简单的&#xff0c;最核…

JavaScript高级 |彻底搞懂原型对象

本文已收录于专栏⭐️ 《JavaScript》⭐️ 学习指南&#xff1a;对象的原型函数的原型new操作符将方法放原型里constructor总结梳理原型对象内存表现完结散花参考文献对象的原型 JavaScript 当中每个对象都有一个特殊的内置属性[[prototype ]] ,这个特殊的对象可以指向另外一个…

高并发编程之ThreadPool 线程池

10 ThreadPool 线程池 10.1 线程池简介 线程池&#xff08;英语&#xff1a;thread pool&#xff09;&#xff1a;一种线程使用模式。线程过多会带来调度开销&#xff0c; 进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理 者分配可并发执…

Django期末考试复习

目录一、Django复习内容二、建立一个项目1.进入环境2.建立项目3.打开文件三、建立APP1.进入View文件2.进入Django环境3.建立App四、注册超级用户1.INSTALLED_APPS配置2.建立模型3.数据库的迁移4.进入环境注册超级用户5.开启服务器五、配置数据库一、Django复习内容 二、建立一个…