iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一文搞懂正则表达式基础语法以及如何应用
  • 823
分享到

一文搞懂正则表达式基础语法以及如何应用

2024-04-02 19:04:59 823人浏览 八月长安
摘要

目录一、正则表达式1、基本介绍2、正则表达式语法二、正则语法1、字符匹配符、选择匹配符2、限定符3、定位符4、分组三、常用类1、基本介绍2、分组、捕获、反向引用3、String 类中

一、正则表达式

1、基本介绍

▶ 概述

  1. 一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后就觉得这些复杂的表达式写起来还是相当简单的, 而且, 一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成。
  2. 正则表达式不是只有java才有,实际上很多编程语言都支持正则表达式进行字符串操作!

▶ 快速入门

public class RegTheory {
    public static void main(String[] args) {
        //目标:匹配所有四个数字
        String content = "2002fsd ke ire i2222 ";
 
        //1. \\d 表示一个任意的数字
        String regStr = "(\\d\\d)(\\d\\d)";
 
        //2. 创建模式对象[即正则表达式对象]
        Pattern pattern = Pattern.compile(regStr);
 
        //3. 创建匹配器
        //说明:创建匹配器 matcher, 按照 正则表达式的规则 去匹配 content 字符串
        Matcher matcher = pattern.matcher(content);
 
        //4. 开始匹配
        while (matcher.find()) {
            System.out.println("找到: " + matcher.group(0));
            System.out.println("第 1 组()匹配到的值=" + matcher.group(1));
            System.out.println("第 2 组()匹配到的值=" + matcher.group(2));
        }
    }
}

▶ 底层源码

        matcher.find() 完成的任务 (考虑分组),{什么是分组,比如 (\d\d)(\d\d) ,正则表达式中有() 表示分组,第 1 个()表示第 1 组,第 2 个()表示第 2 组...}
        1. 根据指定的规则 , 定位满足规则的子字符串 ( 比如 (20)(02))
        2. 找到后,将 子字符串的开始的索引记录到 matcher 对象的属性 int[ ] groups;
         ▷ groups[0] = 0 , 把该子字符串的结束的索引+1 的值记录到 groups[1] = 4
         ▷ 记录 1 组 () 匹配到的字符串 groups[2] = 0 groups[3] = 2
         ▷ 记录 2 组 () 匹配到的字符串 groups[4] = 2 groups[5] = 4
         ▷ 如果有更多的分组.....
        3. 同时记录 oldLast 的值为 子字符串的结束的 索引 +1 的值即 16, 即下次执行 find 时,就从 16  开始匹配。

▶ matcher.group(0) 分析

public String group(int group) {
    if (first < 0){
        throw new IllegalStateException("No match found");
    }
 
    if (group < 0 || group > groupCount()){
        throw new IndexOutOfBoundsException("No group " + group);
    }
 
    if ((groups[group*2] == -1) || (groups[group*2+1] == -1)){
        return null;
    }
 
    return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
}

根据 groups[0]=16 和 groups[1]=20  的记录的位置,从 content 开始截取子字符串返回

就是 [16,20) 包含 16  但是不包含索引为 20  的位置  如果再次指向 find 方法 . 仍然安上面分析来执行。

▶ 小结

        1. 如果正则表达式有() 即分组
        2. 取出匹配的字符串规则如下
        3. group(0) 表示匹配到的子字符串
        4. group(1) 表示匹配到的子字符串的第一组字串
        5. group(2) 表示匹配到的子字符串的第 2 组字串
        6. ... 但是分组的数不能越界.

2、正则表达式语法

▶ 基本介绍

     如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:

     ①限定符,②选择匹配符,③分组组合和反向引用符,④特殊字符,⑤字符匹配符,⑥定位符

▶ 元字符(Metacharacter)-转义号

        符号说明: 在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号。则检索不到结果,甚至会报错的。 案例:用$ 去匹配 “abc$(" 会怎样?

        在Java的正则表达式中,两个\\ 代表其他语言中的一个\

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

二、正则语法

1、字符匹配符、选择匹配符

▶ 基本介绍

▶ 代码实现

String content = "a11c8abc _ABCy @";
 
String regStr = "[a-z]"; //匹配 a-z 之间任意一个字符
 
String regStr = "[A-Z]"; //匹配 A-Z 之间任意一个字符
 
String regStr = "abc"; //匹配 abc 字符串[默认区分大小写]
 
String regStr = "(?i)abc"; //匹配 abc 字符串[不区分大小写]
 
String regStr = "[0-9]"; //匹配 0-9 之间任意一个字符
 
String regStr = "[^a-z]"; //匹配 不在 a-z 之间任意一个字符
 
String regStr = "[^0-9]"; //匹配 不在 0-9 之间任意一个字符
 
String regStr = "[abcd]"; //匹配 在 abcd 中任意一个字符
 
String regStr = "\\D"; //匹配 不在 0-9 的任意一个字符
 
String regStr = "\\w"; //匹配 大小写英文字母, 数字,下划线
 
String regStr = "\\W"; //匹配 等价于 [^a-zA-Z0-9_]
 
// \\s 匹配任何空白字符(空格,制表符等)
String regStr = "\\s";
 
// \\S 匹配任何非空白字符 ,和\\s 刚好相反
String regStr = "\\S";
 
//. 匹配出 \n 之外的所有字符,如果要匹配.本身则需要使用 \\.
String regStr = ".";
//当创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写. 
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);

▶ 选择匹配符

String content = "study hard"; 
String regStr = "t|a|r";

2、限定符

▶ 基本介绍

▶ 代码实现

String content = "a211111aaaaaahello";
 
String regStr = "a{3}"; // 表示匹配 aaa
String regStr = "1{4}"; // 表示匹配 1111
String regStr = "\\d{2}"; // 表示匹配 两位的任意数字字符
 
//细节:java 匹配默认贪婪匹配,即尽可能匹配多的
String regStr = "a{3,4}"; //表示匹配 aaa 或者 aaaa
String regStr = "1{4,5}"; //表示匹配 1111 或者 11111
String regStr = "\\d{2,5}"; //匹配 2 位数或者 3,4,5
 
//1+
String regStr = "1+"; //匹配一个 1 或者多个 1
String regStr = "\\d+"; //匹配一个数字或者多个数字
 
//1*
String regStr = "1*"; //匹配 0 个 1 或者多个 1
 
//遵守贪婪匹配
String regStr = "a1?"; //匹配 a 或者 a1

3、定位符

▶ 基本介绍

▶ 代码实现

String content = "123-abc sldkjfs s dfsjf";
 
String content = "123-abc";
 
//以至少 1 个数字开头,后接任意个小写字母的字符串
String regStr = "^[0-9]+[a-z]*";
 
//以至少 1 个数字开头, 必须以至少一个小写字母结束
String regStr = "^[0-9]+\\-[a-z]+$";
 
//表示匹配边界的 han[这里的边界是指:被匹配的字符串最后,也可以是空格的子字符串的后面]
String regStr = "han\\b";
 
//和\\b 的含义刚刚相反
String regStr = "han\\B";

4、分组

▶ 基本介绍

▶ 代码实现

String content = "hello world s7789 nn1189han";
 
//命名分组: 即可以给分组取名
String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配 4 个数字的字符串
 
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
 
while (matcher.find()) {
    System.out.println("找到=" + matcher.group(0));
    System.out.println("第 1 个分组内容=" + matcher.group(1));
    System.out.println("第 1 个分组内容[通过组名]=" + matcher.group("g1"));
    System.out.println("第 2 个分组内容=" + matcher.group(2));
    System.out.println("第 2 个分组内容[通过组名]=" + matcher.group("g2"));
}

三、常用类

1、基本介绍

▶ 概述

  ▷ java.util.regex 包主要包括以下三个类Pattern 类、Matcher 类和 PatternSyntaxException   ▷ Pattern 类
        pattern 对象是一个正则表达式对象。Pattern 类没有公共构造方法。要创建一个Pattern 对象 调用其公共静态方法,它返回一个Pattern 对象。该方法接受一个正则表达式作为它的第一个参数,比如: Pattern r=Pattern.compile(pattern);
  ▷ Matcher类
        Matcher对象是对输入字符串进行解释和匹配的引擎。 与Pattern 类一样, Matcher 也没有公共构造方法。 你需要调用 Pattern 对象的 matcher方法来获得一个 Matcher对象
  ▷ PatternSyntaxException
        PatternSyntaxException 是一个非强制异常类, 它表示一个正则表达式模式中的语法错误。

▶ 代码实例

public class PatternMethod {
    public static void main(String[] args) {
        String content = "hello abc hello, 努力学习";
 
        //String regStr = "hello";
 
        String regStr = "hello.*";
 
        boolean matches = Pattern.matches(regStr, content);
 
        System.out.println("整体匹配= " + matches);
    }
}

▶ Matcher 常用类

public class MatcherMethod {
    public static void main(String[] args) {
        String content = "hello edu jack edutom hello smith hello edu edu";
 
        String regStr = "hello";
 
        Pattern pattern = Pattern.compile(regStr);
 
        Matcher matcher = pattern.matcher(content);
 
        while (matcher.find()) {
            System.out.println(matcher.start());
            System.out.println(matcher.end());
            System.out.println("找到: " + content.substring(matcher.start(), matcher.end()));
        }
 
        //整体匹配方法,常用于,去校验某个字符串是否满足某个规则
        System.out.println("整体匹配=" + matcher.matches());
 
        //完成如果 content 有 edu 替换成 努力学习
        regStr = "edu";
        pattern = Pattern.compile(regStr);
        matcher = pattern.matcher(content);
 
        //注意:返回的字符串才是替换后的字符串 原来的 content 不变化
        String newContent = matcher.replaceAll("努力学习");
 
        System.out.println("newContent=" + newContent);
        System.out.println("content=" + content);
    }
}

2、分组、捕获、反向引用

▶ 基本介绍

1、分组

        我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式(一个分组)。

2、捕获

        把正则表达式中子表达式(分组匹配)的内容,保存到内存中以数字编号或显式命名的组里, 方便后面引用, 从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以以此类推,组0代表的是整个正则式。

3、反向引用

        圆括号的内容被捕获后,可以在这个括号后被使用, 从而写出一个比较实用的匹配式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号。

▶ 经典案例

public class RegExp13 {
    public static void main(String[] args) {
        String content = "我....我要....学学学学....编程 java!";
 
        //1. 去掉所有的.
        Pattern pattern = Pattern.compile("\\.");
        Matcher matcher = pattern.matcher(content);
        content = matcher.replaceAll("");
 
        //2. 去掉重复的字 我我要学学学学编程 java!
        //(1) 使用 (.)\\1+
        //(2) 使用 反向引用$1 来替换匹配到的内容
        // 注意:因为正则表达式变化,所以需要重置 matcher
 
        pattern = Pattern.compile("(.)\\1+");//分组的捕获内容记录到$1
 
        matcher = pattern.matcher(content);
 
        //使用 反向引用$1 来替换匹配到的内容
        content = matcher.replaceAll("$1");
 
        System.out.println("content=" + content);
    }
}

3、String 类中使用正则表达式

▶ 替换功能

        String 类:  public String replaceAll(String regex,String replacement)

▶ 判断功能

        String 类:  public boolean matches(String regex){} // 使用 Pattern Matcher

▶ 分割功能

        String 类:  public String[] split(String regex)

▶ 代码实例

String content = "2000 年 5 月,jdk1.3、JDK1.4 和 J2SE1.3 相继发布。";
 
//使用正则表达式方式,将 JDK1.3 和 JDK1.4 替换成 JDK
content = content.replaceAll("JDK1\\.3|JDK1\\.4", "JDK");
 
System.out.println(content);
//要求 验证一个 手机号, 要求必须是以 138 139 开头的
content = "13888889999";
 
if (content.matches("1(38|39)\\d{8}")) {
    System.out.println("验证成功");
} else {
    System.out.println("验证失败");
}
//要求按照 # 或者 - 或者 ~ 或者 数字 来分割
content = "hello#abc-jack12smith~北京";
 
String[] split = content.split("#|-|~|\\d+");
 
for (String s : split) {
    System.out.println(s);
}

 总结

到此这篇关于正则表达式基础语法以及如何应用的文章就介绍到这了,更多相关正则表达式基础语法及应用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文搞懂正则表达式基础语法以及如何应用

本文链接: https://www.lsjlt.com/news/168619.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文搞懂正则表达式基础语法以及如何应用
    目录一、正则表达式1、基本介绍2、正则表达式语法二、正则语法1、字符匹配符、选择匹配符2、限定符3、定位符4、分组三、常用类1、基本介绍2、分组、捕获、反向引用3、String 类中...
    99+
    2024-04-02
  • 一文搞懂Java正则表达式的使用
    目录1.什么是正则表达式2.快速入门案例3.正则表达式语法转义符号字符匹配符字符匹配符演示选择匹配符正则限定符正则定位符1.什么是正则表达式 在了解正则表达式之前,我们先看几个非常常...
    99+
    2024-04-02
  • 一篇文章彻底搞懂python正则表达式
    目录前言1. 正则表达式的基本概念2. python的正则表达式re模块3. 正则表达式语法(1)匹配单个字符(2)匹配多个字符(3)边界匹配(4)分组匹配4. re模块相关方法使用...
    99+
    2024-04-02
  • 一文带你彻底搞懂JavaScript正则表达式
    目录正则表达式的概述什么是正则表达式正则表达式的作用正则表达式的特点正则表达式在js中的使用创建正则表达式测试正则表达式 test正则表达式中的特殊字符正则表达式的组成边界符字符类量...
    99+
    2024-04-02
  • Java正则表达式基础语法详解
    目录什么是正则表达式?字符范围匹配:元字符:多次重复匹配:定位匹配:总结什么是正则表达式? 1、正则表达式是检擦、匹配字符串的表达式 2、正则表达式是描述规则,主流语言都有良好支持...
    99+
    2024-04-02
  • 正则表达式基础学习一文入门
    目录正则表达式是什么元字符贪婪匹配、非贪婪匹配和独占模式分组和引用四种匹配模式断言常用正则Demo正则表达式是什么 校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操...
    99+
    2023-03-23
    正则表达式基础 正则表达式入门
  • Java正则表达式基础语法是什么
    Java正则表达式基础语法如下: 普通字符:普通字符包括大小写字母、数字和一些特殊字符,例如"abc123"。...
    99+
    2024-03-08
    java
  • Java 之正则表达式语法及常用正则表达式汇总
    正则表达式概念: 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表...
    99+
    2023-08-18
    正则表达式 java 开发语言
  • C#正则表达式语法的应用
    这篇文章主要介绍“C#正则表达式语法的应用”,在日常操作中,相信很多人在C#正则表达式语法的应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式语法的应用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Java 基础进阶篇(十八):正则表达式匹配规则和应用
    文章目录 一、正则表达式概述二、正则表达式的匹配规则三、正则表达式在方法中的应用3.1 校验手机号、邮箱和座机电话号码3.2 字符串的内容替换和分割 四、编程题目4.1 表示数值的字符串4...
    99+
    2023-09-16
    正则表达式 java 开发语言 leetcode 算法
  • search()方法如何使用正则表达式
    这篇文章给大家分享的是有关search()方法如何使用正则表达式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。     使用字符串方法   &n...
    99+
    2024-04-02
  • 如何理解PHP正则表达式的应用实例
    这篇文章将为大家详细讲解有关如何理解PHP正则表达式的应用实例,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP正则表达式的应用有很多,那么我们在实际开发应用中会遇到提取字符串、高级的代换...
    99+
    2023-06-17
  • 如何使用.NET正则表达式区分中英文
    这篇文章主要介绍“如何使用.NET正则表达式区分中英文”,在日常操作中,相信很多人在如何使用.NET正则表达式区分中英文问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用.NET正则表达式区分中英文”的疑...
    99+
    2023-06-18
  • 如何使用正则表达式判断邮箱(以C#为例)
    目录首先引入正则需要使用的命名空间判断是否为QQ邮箱判断是否为邮箱补充:C#正则表达式(Regex类)总结日常开发中,判断邮箱是少不了的,这个我以**C#**为例,来写一个判断方法,...
    99+
    2024-04-02
  • 如何使用正则表达式匹配注释tsql语句
    如何使用正则表达式匹配注释tsql语句,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。让我们来看一些例子: 代码如下: --...
    99+
    2024-04-02
  • vue基础语法中的插值表达式如何理解
    vue基础语法中的插值表达式如何理解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、vscode插件介绍在我们演示插值表达式之前,我们先安装这一个VScode给我们提供的插件...
    99+
    2023-06-29
  • 一文带你快速了解JS正则表达式的使用方法
    那下面正式进入序言部分,我们先了解一下为什么在JavaScript中需要正则表达式,这里如果之前学过其他编程语言,应该大致对正则表达式会有一个理解,但没有学过的也不用担心:正则表达式大白话就是一个能判定你的输入内容是否符合设计者规定的一个式...
    99+
    2023-05-14
    javascript 正则表达式
  • 如何利用正则表达式进行代码重构以及去除冗余代码
    这篇文章主要为大家展示了“如何利用正则表达式进行代码重构以及去除冗余代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用正则表达式进行代码重构以及去除冗余代码”这篇文章吧。refact之前...
    99+
    2023-06-04
  • 如何使用Python中的正则表达式处理html文件
    使用Python中的正则表达式处理html文件 finditer方法是一种全匹配方法。您可能已经使用了findall方法,它返回多个匹配字符串的列表。finditer返回一个迭代器顺...
    99+
    2023-05-18
    python 处理html python操作html文件 python正则表达式
  • 如何在 Go 中使用正则表达式解析 CSV 文件?
    如何在 go 中使用正则表达式解析 csv 文件?1. 导入 regexp 库。2. 使用 regexp.mustcompile 创建一个匹配 csv 行字段的正则表达式。3. 使用 r...
    99+
    2024-05-14
    csv 正则表达式 字符串数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作