正则表达式-入门

news2024/10/11 6:26:28

什么是正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式是对字符串执行模式匹配的技术


快速入门

基本使用

        String str = "1995年";
        //\\d表示任意一个数字
        String regStr = "\\d\\d\\d\\d";//表示四个数字连在一起
        //括号()代表分组
        //创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        //创建匹配器
        Matcher matcher = pattern.matcher(str);
        //开始匹配
        while(matcher.find()){
            System.out.println("找到:"+matcher.group());//matcher.group(1):代表第一组
        }

正则表达式语法

  • 限定符
  • 选择匹配符
  • 分组组合和反向引用
  • 特殊字符
  • 字符匹配符
  • 定位符

元字符-转义符

java的正则表达式中"\"代表其他语言的""

需要用到的转义字符:. * + ( ) $ / \ ? [ ] ^ { }

限定符

*:指定字符重复0或n次(无要求)零到多

+:指定字符重复1次或n次(至少一次)1到多

?:指定字符重复0次或1次(最多一次)0到1

{n}:只能输入n个字符

{n,}:指定至少n个字符

{n,m}:指定至少n个但不多于m个匹配

选择匹配符

|:|前或后的符号

分组组合和反向引用符

常用分组的构造形式
(pattern):非命名捕获.捕获匹配的自字符串.编号为0的第一个捕获是由整个正则表达式匹配模式的文本,其他捕获结果则根据左括号的顺序从1开始自动编号

(?<name>pattern):命名捕获.将匹配的子字符串捕获到一个组名抽或者编号名称中.用于name的字符串不能将包含任何把标点斌不能包含任何标点,并不能数字开头,可以使用单引号或者尖括号
特别分组
![](https://secure2.wostatic.cn/static/2pygfWwUeMXkr71ebf3g51/image.png?auth_key=1728117643-4haVcn7QnRw85bZvDH9GKZ-0-01b91ef6d673100c9e36b5621112384b)

特殊字符

字符匹配符

.:代表所有字符

[ ]:可接受的字符列表

[^]:不可接受的字符列表

-:连字符

[efgh]:e,f,g,h的任意字符

[^abc]:除了abc之外任意一个字符,包括数字和特殊字符

A-Z:任意单个大写字母

.:匹配除\n以外的任何字符:a..b:以a开头以b结尾的四个字符串

\\d:匹配单个字符相当于[0-9]

\\D:相当于[^0-9]

\\w:相当于[0-9a-zA-Z_]

\\W:相当于[^0-9a-zA-Z_]

\\s:空白字符,(空格,制表符)

\\S:对\s取反

java正则表达式默认是区分字母大小写的,如何实现不区分大小写

  • (?i)abc:表示abc都不区分大小写 a(?i)bc:表示bc不区分大小写 a((?i)b)c:表示只有b不区分大小写 +Pattern pat = Pattren.compile(regEX,Pattern.CASE_INSENSITIVE);

定位符

^:指定起始字符

$:指定结束字符

\\b:匹配目标字符串边界

\B:匹配目标字符的非边界


取消贪婪匹配

在限定符后面:+? 比如\\d+?

简单应用

               //汉字
//        String content = "安徽工业经济职业技术学院";
//        String regStr = "^[\u0391-\uffe5]+$";
//        String content = "235300";//邮政编码
//        String regStr = "^[1-9]\\d{5}$";
//        String content = "1650387911";//qq号码
//        String regStr = "^[1-9]\\d{4,9}$";
//        String content = "13499332134";
//        String regStr = "^1[3|4|5|8]\\d{9}$";
        String content = "https://blog.csdn.net/blue_show/article/details/126908597";
        String regStr = "^((http|https)://)(([\\w-])+\\.)+(\\/[\\w-?=&/%.#]*)?$";
        if (Pattern.compile(regStr).matcher(content).find()){
            System.out.println("满足");
        }else {
            System.out.println("不满足");
        }

正则表达式三个常用类

Pattern

Pattren 对象是一个正则表达式对象,Pattren类没有公共构造方法,要创建一个Pattern 对象,调用其公共静态方法,它返回一个Pattern 对象,该方法接收一个正则表达式作为它的一个参数,

比如:`Pattern r = Pattern.compile(pattern)`
        String content = "anhiu";
        String regStr = "anhiu";
        boolean matches = Pattern.matches(regStr, content);
        System.out.println(matches);//true

Matcher

Matcher 对象是对输入字符串进行解释和匹配的引擎,与Pattern 类一样,Matcher也没有公共构造方法,你需要调用Pattern对象的matcher方法来获取一个Matcher对对象
int start()返回以前匹配的初始索引
int start(int group)返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
int end(int group)返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量
int end()返回最后匹配字符之后的偏移量
boolean find()尝试查找与该模式匹配的输入序列的下一个子序列
boolean find(int start)重置匹配器,然后尝试查找匹配该模式,从指定索引开始的输入序列的下一个子序列
boolean matches()尝试将整个区域与模式匹配
String replaceAll(String replacement)替换模式与给定替换字符串想匹配的输入序列的第一个子序列

PatternSyntaxExcrption

`PatternSyctaxEcxeption`是一个非强制异常类,它表示一个正则表达式模式中的语法错误

分组,捕获,反向引用

  • 分组:我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看做是一个子表达式/分组
  • 捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组名,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推,组0表示的是整个正则式
  • 反向引用:圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以式在正则表达式内部,也可以是在正则表达式外部,内部反向引用\分组号,外部反向引用¥分组号
  String content = "hello33333 jack2332 tom11 jack22 yyy xxx";
        String regStr = "(\\d)\\1";//匹配两个连续相同的数字
        String regStr1 = "(\\d)(\\d)\\2\\1";//个位和千位相同的
        Pattern compile = Pattern.compile(regStr1);
        Matcher matcher = compile.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

结巴去重

public static void main(String[] args) {
        String content = "我我我.....要要要......学学";
        String regStr1 = "\\.";//个位和千位相同的
        Pattern pattern = Pattern.compile(regStr1);
        Matcher matcher = pattern.matcher(content);
        content = matcher.replaceAll("");
        System.out.println("去点:"+content);
        //去重
//        pattern = Pattern.compile("(.)\\1+");
//        matcher = pattern.matcher(content);
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//        }
//        //使用反向引用$1来替换匹配的内容
//        content=matcher.replaceAll("$1");
//        System.out.println(content);
         content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
        System.out.println(
                content
        );
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python爬虫系列】_025.关于互斥锁(Lock)

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import path…

【SEO】什么是SEO?

什么是SEO&#xff08;搜索引擎优化&#xff09;&#xff1f;为什么SEO对于⼀个⽹站⾄关重要&#xff1f; SEO 全称是搜索引擎优化&#xff08;Search Engine Optimization&#xff09; 因为我们目前开发的网址&#xff0c;需要人看到&#xff0c;除了通过宣传营销的方式展现…

C++ | Leetcode C++题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution { public:string validIPAddress(string queryIP) {if (queryIP.find(.) ! string::npos) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur (i 3 ? queryIP.size() : queryIP.find(., last 1));if (cur st…

ctf.bugku-eval

题目来源&#xff1a;eval - Bugku CTF 访问页面&#xff0c; 代码解释 <?phpinclude "flag.php"; //包含"flag.php"文件$a $_REQUEST[hello]; //从请求参数hello中获取值并赋给变量$a。 eval( "var_dump($a);"); //…

SQLAlchemy模型定义:映射数据库表到Python类

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它提供了一个高层的ORM以及底层的SQL表达式语言。使用SQLAlchemy&#xff0c;开发者可以以面向对象的方式来操作数据库&#xff0c;而不必编写复杂的SQL语句。本文将详细介绍…

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;一个常见的问题是模型会产生幻觉&#xff08;即生成的内容与事实不符&#xff09;&#xff0c;同时由于缺乏企业内部数据的支持&#xff0c;导致其回答往往不够精准和具体&#xff0c;偏向于泛泛而谈。这些问题…

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发

前提&#xff1a;咱们在wsl-Ubuntu上&#xff0c;有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项&#xff0c;需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来&#xff0…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

继承--C++

文章目录 一、继承的概念及定义1、继承的概念 二、继承定义1、定义格式2、继承基类成员访问方式的变化3、继承类模板 三、基类和派生类间的转换1、继承中的作用域2、隐藏规则&#xff1a; 四、派生类的默认成员函数1、4个常见默认成员函数2、实现⼀个不能被继承的类 五、继承与…

(八)Proteus仿真STM32单片机GPIO驱动数码管

1&#xff0c;参考上篇&#xff0c;将LED点阵屏更换成数码管如下图 2&#xff0c;修改驱动函数&#xff0c;数组seg[14]前10个是0-9数字的编码&#xff0c;后四个是空格&#xff0c;点&#xff0c;横线&#xff0c;下划线 char seg_decode(char num)//数字解码 {const char se…

【华为欧拉】国产OpenEuler服务器系统安装以及图形界面

openEuler下载 | openEuler ISO镜像 | openEuler社区官网 下载安装iso 本次选择4G的社区版本 安装&#xff0c;复制到光盘&#xff0c;光盘引导安装。虚拟机安装&#xff0c;准备好iso文件引用&#xff0c;指定好安装源&#xff0c;安装界面和centOS基本一样。选择最小安装就…

JVM系列(二) -类的加载过程介绍

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件&#xff0c;然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件&#xff1f;如何加载class文件&#xff1f;class文件进入到虚拟机后发…

彻底理解TypeScript函数语法

目录 参数类型基本声明默认参数剩余参数可选只读匿名函数回调函数 返回值类型函数类型表达式调用签名构造签名 函数的重载this可推导的编译选项this类型内置工具 函数是JavaScript非常重要的组成部分&#xff0c;TypeScript中也是如此&#xff0c;TypeScript 提供了强大的类型系…

网关在不同行业自动化生产线的应用

网关在不同行业自动化生产线的应用&#xff0c;展示了其作为信息与物理世界交汇点的广泛影响力&#xff0c;尤其在推动行业智能化、自动化方面发挥了不可估量的作用。以下是网关技术在污水处理、智慧农业、智慧工厂、电力改造及自动化控制等领域的深入应用剖析。 1. 污水处理 …

盒子模型的简单运用

1.块内元素与行内元素 HTML_code <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Scala面试题大全~基础题(15题)

1&#xff1a;Scala是什么? Scala是一种多范式的编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;它支持面向对象、函数式和命令式编程方法。Scala运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;这意味着它可以与Java代码无缝集成。它还…

【多版本并发控制(MVCC)】

并发事务问题&#xff1a; MySQL隔离级别-未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别对于并发事务的解决情况 隔离级别脏读不可重复读幻读未提交读不可不可不可读已提交可不可不可可重复读 &#xff08;默认&#xff09;可可不可串行化&…

现货黄金价格走势图策略分析 先看“势”

在现货黄金投资市场&#xff0c;对金价走势图的趋势进行分析&#xff0c;是投资者做出明智决策的关键步骤。通过有效的趋势分析&#xff0c;投资者可以更好地预测市场的走向&#xff0c;从而制定相应的交易策略。本文将详细介绍如何分析金价的趋势&#xff0c;并探讨这种分析方…

J1学习打卡

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 # 数据预处理和加载 import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, …