首页 > 其他分享 >解放生产力!一文教你快速入门正则表达式

解放生产力!一文教你快速入门正则表达式

时间:2023-01-02 20:00:56浏览次数:43  
标签:字符 匹配 入门 正则表达式 文教 查找 str 表达式

一、概述

正则表达式一般用于文本内容的查找和替换,在日常工作中还可用来校验用户的输入是否符合自定义的规则。

正则表达式是匹配模式,要么匹配字符,要么匹配位置

正则表达式不要背正则表达式不要背

二、基本语法

单个字符数量位置
\d 匹配数字 * 0 个或者更多 ^一行的开头
\w 匹配 word(数字、字母) + 1 个或更多,至少 1 个 $ 一行的结尾
\W 匹配「非」word(数字、字母) ? 0 个或 1 个,一个 Optional \b 单词"结界"(word bounds)
\s 匹配 white space(包括空格、tab 等) {min,max}出现次数在一个范围内 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
\S 匹配「非」white space(包括空格、tab 等) {n}匹配出现 n 次的 { 标记限定符表达式的开始。要匹配 {,请使用 {。
. 匹配任何,任何的字符   |指明两项之间的一个选择。要匹配 |,请使用 \|

「[ ]」 定义一个字符集合

  • 0-9、a-z 定义了一个「字符区间」,区间使用 ASCII 码来确定,字符区间在 [ ] 中使用。若没有-连字符,则取的雨元素从[ ]中取
  • 「在[]中,特殊字符不需要转义,可以直接使用」
  • 「^」 在 [ ] 中是取非操作。

「常见示例:」

  • 身份证号(15 位、18 位数字),最后一位是校验位,可能为数字或字符 X:**(^\d15}$)(^\d{18)**
  • 数字:**^[0-9]\*$**
  • 中文字符的正则表达式:**[\u4e00-\u9fa5]**
  • Email 地址:**^\w+([-+.]\w+)\@\w+([-.]\w+)\.\w+([-.]\w+)\*$**

「修饰符」

下表列出了正则表达式常用的修饰符:

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

「示例」

var str="Google runoob taobao runoob";
var n1=str.match(/runoob/);   // 查找第一次匹配项
var n2=str.match(/runoob/g);  // 查找所有匹配项

var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g);   // 匹配一个

var str="google\nrunoob\ntaobao";
var n1=str.match(/google./);   // 没有使用 s,无法匹配\n
var n2=str.match(/runoob./s);  // 使用 s,匹配\n
var n2=str.match(/^runoob/gm);  // 多行匹配

三、子表达式

使用 「( )」 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。

子表达式可以嵌套,但是嵌套层次过深会变得很难理解。

「正则表达式」

(ab){2,}

「匹配结果」

ababab

「|」 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。

「正则表达式」

(19|20)\d{2}

「匹配结果」

1. 1900
2. 2010
3. 1020

「应用」

匹配 IP 地址。

IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的:

  • 一位数字
  • 不以 0 开头的两位数字
  • 1 开头的三位数
  • 2 开头,第 2 位是 0-4 的三位数
  • 25 开头,第 3 位是 0-5 的三位数

「正则表达式」

((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))

「匹配结果」

1. 192.168.0.1
2. 00.00.00.00
3. 555.555.555.555

四、回溯引用

回溯引用使用 「\n」 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。

「应用」

匹配 HTML 中合法的标题元素。

「正则表达式」

\1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。

<(h[1-6])>\w*?<\/\1>

「匹配结果」

1. <h1>x</h1>
2. <h2>x</h2>

替换

需要用到两个正则表达式。

「应用」

修改电话号码格式。

「文本」

313-555-1234

「查找正则表达式」

(\d{3})(-)(\d{3})(-)(\d{4})

「替换正则表达式」

在第一个子表达式查找的结果加上 () ,然后加一个空格,在第三个和第五个字表达式查找的结果中间加上 - 进行分隔。

($1) $3-$5

「结果」

(313) 555-1234

大小写转换

元字符说明
\l 把下个字符转换为小写
\u 把下个字符转换为大写
\L 把\L 和\E 之间的字符全部转换为小写
\U 把\U 和\E 之间的字符全部转换为大写
\E 结束\L 或者\U

「应用」

把文本的第二个和第三个字符转换为大写。

「文本」

abcd

「查找」

(\w)(\w{2})(\w)

「替换」

$1\U$2\E$3

「结果」

aBCd

五、前后查找

前后查找规定了匹配的内容首尾应该匹配的内容,但是又不包含首尾匹配的内容。

向前查找使用 「?=」 定义,它规定了尾部匹配的内容,这个匹配的内容在 ?= 之后定义。所谓向前查找,就是规定了一个匹配的内容,然后以这个内容为尾部向前面查找需要匹配的内容。向后匹配用 ?<= 定义(注: JavaScript 不支持向后匹配,Java 对其支持也不完善)。

「应用」

查找出邮件地址 @ 字符前面的部分。

「正则表达式」

\w+(?=@)

「结果」

「abc」 @qq.com

对向前和向后查找取非,只要把 = 替换成 ! 即可,比如 (?=) 替换成 (?!) 。取非操作使得匹配那些首尾不符合要求的内容。

六、嵌入条件

回溯引用条件

条件为某个子表达式是否匹配,如果匹配则需要继续匹配条件表达式后面的内容。

「正则表达式」

子表达式 ( \ ( ) 匹配一个左括号,其后的 ? 表示匹配 0 个或者 1 个。 ?(1) 为条件,当子表达式 1 匹配时条件成立,需要执行 ) 匹配,也就是匹配右括号。

(\()?abc(?(1)\))

「结果」

1. (abc)
2. abc
3. (abc

前后查找条件

条件为定义的首尾是否匹配,如果匹配,则继续执行后面的匹配。注意,首尾不包含在匹配的内容中。

「正则表达式」

?(?=-) 为前向查找条件,只有在以 - 为前向查找的结尾能匹配 \d{5} ,才继续匹配 -\d{4} 。

\d{5}(?(?=-)-\d{4})

「结果」

1. 11111
2. 22222-
3. 33333-4444

标签:字符,匹配,入门,正则表达式,文教,查找,str,表达式
From: https://www.cnblogs.com/tangredtea/p/17020418.html

相关文章

  • python 使用 VSCode 入门简介
    本文主要介绍如何使用VSCode创建、编辑、运行、调试hello.py程序,对如何安装使用python不做介绍,也不对安装vscode介绍。准备事项电脑安装python3,vscode,并安装v......
  • AutoCAD Civil3D 2023安装图文教程
    ​Civil3D2023简单介绍Civil3D设计软件是土木工程师的首选软件,也是民用大众领域的综合解决方案,同时Civil3D提供了AutoCAD和AutoCADMap3D的功能,该软件使用基于模型的......
  • 大学生入门到精通JAVA系列(一)大学生在哪里写技术博客
    简书知乎专栏GithubPage当然也可以自己建站。 以上是我知道并且大部分写过的博客地址,今天先在这列一下,后续补充完善下各自优缺点。如果有感觉不错的技术博客可以在评论留......
  • 【C++入门】(九)位运算与常用库函数
    一.位运算符号运算&与|或~非^异或>>右移<<左移常用操作:求x的第k位数字x>>k&1lowbit(x)=x&-x,返回x的最后一位1 二.......
  • 【C++入门】(八)STL
    一. #include<vector>vector是变长数组,支持随机访问,不支持在任意位置O(1)O(1)插入。为了保证效率,元素的增删一般应该在末尾进行 1.1声明#include<vector>......
  • 【C++入门】(六)函数
    一.函数基础一个典型的函数定义包括以下部分:返回类型函数名由0个或多个形参组成的列表函数体 1.1编写函数//编写一个求阶乘的程序:intfact(intval){......
  • 【C++入门】(七)类、结构体、指针、引用
    一. 类与结构体类的定义:classPerson{private:intage,height;doublemoney;stringbooks[100];public:stringna......
  • 狂神说Java(零基础) Java入门笔记
    1.Java帝国的诞生​1972年C诞生,比1995年诞生的Java早了20多年。C贴近硬件,运行极快,效率极高,用于操作系统、编译器、数据库、网络系统等,但是在指针和内存管理方面,常常让程序......
  • Kusto 2023 快速入门 开篇 —— 启发式和探索式的大数据分析工具
    陈希章2023年1月2日于上海这是一个献给自己的新年礼物,但其实已经构思了很久,这一方面跟我多年的工作经历有关——我的职业生涯中最为有意思的部分可能就是跟数据打......
  • 极客编程python入门-多进程
    多进程在Python程序中轻松创建子进程:importosprint('Process(%s)start...'%os.getpid())#OnlyworksonUnix/Linux/Mac:pid=os.fork()ifpid==0:print('Iam......