• 正则表达式


    一、简介

    1.1概述

    正则表达式是一种用来匹配字符串的强有力的武器。它由普通字符和特殊字符(称为元字符)组成,可以描述一种字符串的模式(pattern)。正则表达式是一种强大的文本处理工具,它可以用于匹配查找替换提取字符串

    1.2应用

    • 匹配和验证文本:正则表达式可以用于验证和匹配文本,例如电子邮件地址、电话号码、网址等。通过使用正则表达式,可以快速准确地确定字符串是否符合特定的格式要求。
    • 搜索和替换文本:正则表达式可以用于搜索和替换文本中的特定模式。例如,可以使用正则表达式搜索包含特定关键字的文件或文本,并将其替换为其他内容。
    • 数据提取:正则表达式可以用于从文本中提取特定的数据,例如从网页中提取电子邮件地址、电话号码等。通过使用正则表达式,可以快速准确地提取所需的数据。
    • 自动化处理:正则表达式可以用于自动化处理文本,例如自动生成代码、批量更改文件名、批量处理数据等。

    1.3相关网站

    二、入门语法

    2.1字符组

    字符组[])允许匹配一组可能出现的字符。

    [ABC]

    匹配 [...] 中的任意字符

    [^ABC]   

    匹配除了 [...] 中字符的所有字符

    [A-Z]                         

    [A-Z] 表示一个区间,匹配所有大写字母,[a-zA-Z] 表示所有字母。

    2.2特殊字符

    许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:

    特别字符描述
    $匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
    ( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 " role="presentation" style="position: relative;">
    *匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
    +匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
    .匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
    [标记一个中括号表达式的开始。要匹配 [,请使用 \[。
    ?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
    \将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
    ^匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。
    {标记限定符表达式的开始。要匹配 {,请使用 \{。
    |指明两项之间的一个选择。要匹配 |,请使用 \|。

    2.3快捷方式

    .                             

    匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]。

    \d       

    匹配数字等价于 [ 0-9_]

    \D        

    匹配非数字等价于 [^ 0-9_]

    \w                   

    匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

    \W                     匹配非字母、数字、下划线。 等价于 [^A-Za-z0-9_]
    [\s\S]                            

    匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。

    2.4锚定

    定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

    定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

    ^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
    $匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
    \b匹配一个单词边界,即字与空格间的位置。
    \B非单词边界匹配。

    2.5限定符

    限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

    *匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于 {0,}。
    +匹配前面的子表达式一次或多次。例如,zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
    ?

    匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 "do" 、 "does"、 "doxy" 中的 "do" 和 "does"。? 等价于 {0,1}。

    {n}n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 "Bob" 中的 o,但是能匹配 "food" 中的两个 o
    {n,}n 是一个非负整数。至少匹配n 次。例如,o{2,} 不能匹配 "Bob" 中的 o,但能匹配 "foooood" 中的所有 o。o{1,} 等价于 o+。o{0,} 则等价于 o*。
    {n,m}m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 "fooooood" 中的前三个 o。o{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。

     * 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

    三、进阶语法

    3.1修饰符

    标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。

    标记不写在正则表达式里,标记位于表达式之外

    iignore - 不区分大小写将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
    gglobal - 全局匹配查找所有的匹配项。
    mmulti line - 多行匹配使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
    s特殊字符圆点 . 中包含换行符 \n默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

    3.2分组

    用圆括号 () 将所有选择项括起来,

    () 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)。

    3.3非捕获分组

    非捕获分组是一种特殊的分组,它用 (?:…) 的形式表示,它的作用是把一些字符组合在一起,但是不会被记住或引用。非捕获分组可以用来限定量词的作用范围,或者用来提高正则表达式的性能。例如,(?:ab)+ 表示匹配一个或多个 "ab",但是不会把每个 "ab" 作为一个捕获组保存。

     3.4选择

    相邻的选择项之间用 | 分隔。

    3.5分组的回溯引用

    分组的回溯引用是一种正则表达式的特性,它可以用 \N 的形式表示,其中 N 是一个数字,表示引用前面第 N 个分组匹配的内容。分组的回溯引用可以用来匹配重复出现的子串或者成对出现的标签。例如,(\w+)\1 可以匹配 "hellohello" 或者 "abcabc",< (\w+)>.*? 可以匹配 "

    hello
    " 或者 "

    world

    "。

    3.6预搜索

    3.6.1正向先行断言

    正向先行断言是一种正则表达式的特性,它用 (?=pattern) 的形式表示,它的作用是匹配一个位置,该位置后面的字符序列能够匹配 pattern。正向先行断言不会消耗匹配的字符,只是用来判断是否满足条件。例如,\d+(?=\.) 可以匹配 "3.14" 中的 "3",但不会匹配 "314" 中的 "314"

     3.6.2 反向先行断言

    指定主表达式后无法匹配的组(如果匹配,则结果将被丢弃)。它用 (?!pattern) 的形式表示

    3.6.3 正向后行断言

    先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。

    正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式

    例如:如果要取出喜欢两个字,要求喜欢的前面有我后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)

    3.6.4反向后行断言

    反向后行断言:(?,指在某个位置向左看,表示所在位置左侧不能匹配表达式

    例如:如果要取出喜欢两个字,要求喜欢的前面没有我后面没有你,这个时候就要这么写:(?

  • 相关阅读:
    LeetCode 33. 搜索旋转排序数组(C++)
    第三十九篇 自定义指令 - directive
    网站SEO标签有什么作用,分享一些重要的标签
    HCIA数据通信——交换机(Vlan间的通信与安全)
    第一个发布成功的UI组件库
    K8s的Pod详细解析
    Debain12 安装 realVNC
    武汉新时标文化传媒有限公司:如何做好短视频直播间的流量?
    操作系统—— I/O 相关知识
    三分钟阿里云服务器全方位介绍(看一篇就够了)
  • 原文地址:https://blog.csdn.net/qq_62377885/article/details/130903585