当前位置:

首页 > 编程开发 > 一文彻底揭秘正则表达式的基础语法与应用

一文彻底揭秘正则表达式的基础语法与应用

正则表达式利用修饰符(i、g、m)调整模式,通过元字符(\w、\d、\s)和量词(+、*、?、{n,m})定义字符范围与重复次数,支持子表达式反向引用、正向预查等高级匹配,实现贪婪/懒惰匹配,显著提升文本搜索、替换及处理的效率。

本文目录

    正则表达式,文本处理界的瑞士军刀。看起来是一堆奇怪的符号,但掌握了它,处理字符串的效率真的能提升一个量级。这篇文章,我们从基础语法讲起,配合实际场景,带你彻底搞懂它。

    一文彻底揭秘正则表达式的基础语法与应用

    一、正则表达式属性(修饰符)

    修饰符的作用很简单:让正则引擎在搜索时,能够切换不同的“视角”。

    1. 【i】不区分大小写

    有时我们只关心内容本身,不关心字母是大写还是小写。这时就可以加上 i 修饰符。比如 /abc/i,就能匹配到 “ABC”、“abc” 以及各种大小写混排的情况。

    var reg1 = /abc/
    var reg2 = /abc/i
    var str1 = 'ABC'
    console.log(reg1.test(str1)) // false
    console.log(reg2.test(str1)) // true

    2. 【g】全局匹配

    如果不加 g,正则匹配到第一个符合条件的结果就会停下。加上 g 之后,它会像扫描仪一样,把整个字符串里所有满足条件的结果都找出来。

    var reg3 = /aa/
    var reg4 = /aa/g
    var str2 = "aabaaaab"
    console.log(str2.match(reg3)) // ["aa"]
    console.log(str2.match(reg4)) // ["aa","aa","aa"]

    3. 【m】执行多行匹配

    默认情况下,^ 匹配字符串的开头,$ 匹配结尾。但如果字符串内有多行文本,加上 m 修饰符后,^ 和 $ 就会分别匹配每一行的开头和结尾。

    var reg5 = /^ab/g
    var reg6 = /^ab/gm
    var str3 = "abcd\nabc"
    console.log(str3.match(reg5)) // ["ab"]
    console.log(str3.match(reg6)) // ["ab","ab"]

    二、正则表达式模式

    模式用来定义我们要搜索的“字符范围”。

    1. 【[]】

    方括号内的内容,代表“在这个范围内取一个字符”。比如 [0-9] 代表匹配一位数字;[a-z] 代表匹配一位小写字母。如果在方括号内加上 ^,就表示“取反”,即匹配不在这个范围内的字符。

    // 匹配连续三个数字
    var reg7 = /[0-9][0-9][0-9]/g
    var reg8 = /[^0-9][^0-9][^0-9]/g
    var str4 = "121231ko23puu123"
    console.log(str4.match(reg7)) // ["121","231","123"]
    console.log(str4.match(reg8)) // ["puu"]

    2. 【()】

    圆括号配合 | 可以表达“或”的逻辑。它会匹配括号内由 | 分隔的任意一个模式。

    var reg9 = /(abc|bcd)/g
    var str5 = "abcabbcd"
    console.log(str5.match(reg9)) // ['abc', 'bcd']

    三、正则表达式的元字符

    元字符是拥有特殊含义的字符,本质上就是功能更强大的表达式。

    1. 【\w】和【\W】

    \w 匹配“单词字符”,包括大小写字母、数字和下划线,等价于 [A-z0-9]。大写 \W 则正好相反,匹配非单词字符。

    var reg10 = /\w\W/g
    var str5 = "a;0,op"
    console.log(str5.match(reg10)) // ['a;', '0,']

    2. 【\d】和【\D】

    正如字面意思所示,\d 代表数字,等价于 [0-9]。它的反义是大写的 \D,匹配非数字。

    var reg11 = /\d\D\D/g
    var str6 = "1jj2lo990ol"
    console.log(str6.match(reg11)) // ['1jj', '2lo', '0ol']

    3. 【\s】和【\S】

    \s 匹配空白字符,包括空格、制表符(\t)、换行符(\n)等。它的反义是大写的 \S。

    var reg12 = /\s/g
    var str7 = "\n123\f123 1"
    console.log(str7.match(reg12)) // ['\n', '\f', ' ']

    4. 【\b】和【\B】

    \b 匹配单词边界,可以理解为单词与空格之间的那个“位置”。大写的 \B 则匹配非单词边界。

    var reg12 = /\b/g
    var str8 = "1231231"
    var str9 = "1231231 123kk"
    var str10 = "1231231 123kk "
    console.log(str8.match(reg12)) // ['', '']
    console.log(str9.match(reg12)) // ['', '', '', '']
    console.log(str10.match(reg12)) // ['', '', '', '']
    
    var reg13 = /\bc/g
    var str11 = "cth cujcc"
    console.log(str11.match(reg13)) // ['c', 'c']

    5. 【\t】、【\n】、【\r】、【\v】、【\f】

    这些元字符匹配的是不可见的特殊字符:\t 是制表符,\n 是换行符,\r 是回车符,\v 是垂直换行符,\f 是换页符。

    var reg14 = /\acts/g
    var str12 = "\actsdf"
    var str13 = "ac\tsdf"
    console.log(str12.match(reg14)) // ['\acts']
    console.log(str13.match(reg14)) // null

    6. 【\u

    四位 Unicode 编码,常用于匹配中文字符。比如 [\u3000-\ua000] 代表一个中文编码区间。

    var reg15 = /\u4f60\u597d/ // 匹配“你好”的Unicode编码
    var str14 = "你好"
    console.log(str14.match(reg15)) // ['你好']

    7. 【.】

    小圆点 . 可以匹配除换行符和行结束符之外的任意单个字符。

    var reg16 = /./g
    var str15 = "你 很\nt帅"
    console.log(str15.match(reg16)) // ['你', ' ', '很', 't', '帅']

    四、正则表达式的量词(代表数量的词)

    量词决定了前面的“模式”要重复出现多少次。

    1. 【n+】

    匹配包含至少一个 n 的字符串。可以出现 1 次到无数次。

    var reg17 = /\w+/g
    var str16 = "abc"
    var str17 = "abcndb"
    console.log(str16.match(reg17)) // ['abc']
    console.log(str17.match(reg17)) // ['abc', 'ndb']

    2. 【n*】

    匹配包含零个或多个 n 的字符串。可以出现 0 次到无数次。

    var reg18 = /\w*/g
    var reg19 = /\d*/g
    var str18 = "abc"
    var str19 = "abcdb"
    console.log(str18.match(reg18)) // ['abc', '']
    console.log(str19.match(reg18)) // ['abcdb', '']
    console.log(str19.match(reg19)) // ['', '', '', '', '', '']

    3. 【n?】

    匹配包含零个或一个 n 的字符串。

    var reg20 = /\w?/g
    var str20 = "aaaaaaaaaa"
    console.log(str20.match(reg20)) // ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', '']

    4. 【n{X}】

    匹配包含 X 个 n 的序列。

    var reg21 = /\w{3}/g
    var str21 = "aaaaaaaaaa"
    console.log(str21.match(reg21)) // ['aaa', 'aaa', 'aaa']

    5. 【n{X,Y}】

    匹配包含 X 至 Y 个 n 的序列。

    var reg22 = /\w{3,5}/g
    var str22 = "aaaaaaaaaaa"
    console.log(str22.match(reg22)) // ['aaaaa', 'aaaaa']

    6. 【n{X,}】

    匹配包含至少 X 个 n 的序列。

    var reg23 = /\w{3,}/g
    var str23 = "aaaaaaaaaaa"
    console.log(str23.match(reg23)) // ['aaaaaaaaaaa']

    7. 【n$】

    n$ 匹配以 n 结尾的字符串。相应的,^n 匹配以 n 开头的字符串。

    var reg24 = /[0-9]b$/g
    var str24 = "0b9o34hb9b"
    console.log(str24.match(reg24)) // ['9b']
    
    var reg24 = /^[0-9]/g
    var str24 = "00934h"
    console.log(str24.match(reg24)) // ['0']

    8. 【?=n】

    这个叫“正向预查”,匹配其后紧接特定字符串 n 的字符串。

    var reg25 = /a(?=b)/g
    var str25 = "abaabaaaa"
    console.log(str25.match(reg25)) // ['a', 'a']

    9. 【?!n】

    跟上面相反,匹配其后没有紧接特定字符串 n 的字符串。也叫“正向断言”。

    var reg26 = /a(?!b)/g
    var str26 = "abaabaaaa"
    console.log(str26.match(reg26)) // ['a', 'a', 'a', 'a', 'a']

    五、正则表达式的对象属性

    正则表达式本身也是一个对象,它有一些内置属性帮助我们了解它的状态。

    1. 【constructor】

    返回创建 RegExp 对象原型的函数。

    var reg27 = /[0-9]/
    console.log(reg27.constructor) // RegExp()

    2. 【global】

    检查是否设置了 “g” 修饰符。

    var reg28 = /[0-9]/g
    console.log(reg28.global) // true

    3. 【ignoreCase】

    检查是否设置了 “i” 修饰符。

    var reg29 = /[0-9]/i
    console.log(reg29.ignoreCase) // true

    4. 【lastIndex】

    规定开始下一个匹配的索引。

    var reg30 = /[0-9]/i
    console.log(reg30.lastIndex) // 0

    5. 【multiline】

    检查是否设置了 “m” 修饰符。

    var reg31 = /[0-9]/m
    console.log(reg31.multiline) // true

    6. 【source】

    返回 RegExp 模式的文本。

    var reg32 = /[0-9]/i
    console.log(reg32.source) // [0-9]

    六、正则表达式的对象方法

    1. 【exec()】

    这个方法可以深入挖掘匹配信息。它会返回找到的值,并确定其位置。

    • 如果全局匹配,它会记住位置,每次调用都返回下一个匹配结果,直到返回 null 后,再从头开始。
    • 通过修改 lastIndex 属性,可以手动控制搜索起点。
    • 如果不加 g 修饰符,lastIndex 不会移动,每次返回的都是第一个结果。
    var reg33 = /ab/g
    var str27 = 'abababa'
    console.log(reg33.exec(str27)) // [0:'ab',index:0]
    console.log(reg33.exec(str27)) // [0:'ab',index:2]
    console.log(reg33.exec(str27)) // [0:'ab',index:4]
    console.log(reg33.exec(str27)) // null
    console.log(reg33.exec(str27)) // [0:'ab',index:0]
    
    reg33.lastIndex = 4
    console.log(reg33.exec(str27)) // [0:'ab',index:4]
    reg33.lastIndex = 3
    console.log(reg33.exec(str27)) // [0:'ab',index:4]

    2. 【test()】

    这是最常用的方法之一,用来测试字符串中是否存在匹配项,返回 true 或 false。

    var reg34 = /ab/
    var str28 = 'abababa'
    console.log(reg34.test(str28)) // true

    toString() 方法则用来返回正则表达式的字符串形式。

    var reg35 = /ab/gi
    console.log(reg35.toString()) // /ab/gi

    七、正则表达式的拓展

    【()】的“子表达式”特性

    圆括号除了用来分组,还有一个隐藏功能:它会“记住”括号内匹配到的内容,之后可以用 \1、\2 这类反向引用将其调出来。

    var reg36 = /(\w)\1\1\1/g
    var str29 = 'aaaabbbb'
    console.log(str29.match(reg36)) // ['aaaa','bbbb']
    
    var reg37 = /(\w)\1(\w)\2/g
    var str30 = 'aabbccdd'
    console.log(str30.match(reg37)) // ['aabb', 'ccdd']
    console.log(reg37.exec(str30)) // [0:'aabb',1:'a',2:'b',...]
    
    var reg38 = /(\w)\1(\w)\2/
    var str31 = 'aabbccdd'
    console.log(str31.match(reg38)) // [0:'aabb',1:'a',2:'b',...]

    八、支持正则表达式的 String 对象的方法

    1. 【search】

    检索与正则表达式相匹配的值。如果找到,返回匹配到的位置;否则返回 -1。

    var reg39 = /(\w)\1(\w)\2/g
    var str32 = 'aabboojj'
    var str33 = 'caabboojj'
    var str34 = 'caaboj'
    console.log(str32.search(reg39)) // 0
    console.log(str33.search(reg39)) // 1
    console.log(str34.search(reg39)) // -1

    2. 【split】

    这个方法很实用,可以用正则来分割字符串,返回分割后的数组。

    var reg40 = /\d/g // 使用数字分割
    var str35 = 'aa8bb7cc9dd'
    console.log(str35.split(reg40)) // ['aa', 'bb', 'cc', 'dd']
    
    var reg41 = /(\d)/g // 使用数字分割,并保留分割符
    var str36 = 'aa8bb8cc9dd'
    console.log(str36.split(reg41)) // ['aa', '8', 'bb', '8', 'cc', '9', 'dd']

    3. 【match】

    找到一个或多个正则表达式的匹配。它和 exec 有些类似,但使用起来更直接。

    var reg42 = /^[0-9]/g
    var str37 = "00934h"
    console.log(str37.match(reg42)) // ['0']

    4. 【replace】

    这是字符串处理中的王牌方法,可以用正则匹配到的内容来进行替换。配合子表达式和 $1、$2,可以实现非常灵活的重构。

    var reg43 = /(\w)\1(\w)\2/g  // 将aabb形式的内容换成bbaa
    var str38 = "aabb"
    console.log(str38.replace(reg43, "$2$2$1$1")) // bbaa
    console.log(str38.replace(reg43, function ($, $1, $2) {
        return $2 + $2 + $1 + $1
    })) // bbaa

    九、补充

    1. 贪婪模式

    正则表达式默认是“贪婪”的——它会在可能的情况下匹配尽可能多的内容。如果想让它变得“懒惰”(能少匹配就少匹配),可以在量词后面加一个 ?。

    var reg44 = /a+/g
    var reg45 = /a+?/g
    var str39 = 'aaaa'
    console.log(str39.match(reg44)) // ['aaaa']
    console.log(str39.match(reg45)) // ['a', 'a', 'a', 'a']
    
    // ① ??
    var reg46 = /a??/g
    var str40 = 'aaaa'
    console.log(str40.match(reg46)) // ['', '', '', '', '']
    
    // ② *?
    var reg47 = /a*?/g
    var str41 = 'aaaa'
    console.log(str41.match(reg47)) // ['', '', '', '', '']

    2. 获取一切的集合

    想用一个正则表达式表示“所有字符”?可以使用 [\s\S] 或 [\d\D] 这样的互补集合组合。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    一些常用的正则表达式及其解释(附示例)
    一些常用的正则表达式及其解释(附示例)

    正则表达式是文本处理利器,用于数据清洗、日志分析和爬虫。介绍了匹配数字、字母、空格、邮箱、URL、日期、电话号码、特定字符、单词边界、数字范围、替换及捕获分组等常用模式,并辅以示例。

    llama.cpp 后端更新:Adreno 分解注意力、CUDA 空分块修复与 SYCL 缓存
    llama.cpp 后端更新:Adreno 分解注意力、CUDA 空分块修复与 SYCL 缓存

    llama.cpp b12314为Adreno OpenCL加入分解Flash Attention,b12316修复CUDA MoE空分块路径读取,b12319源码标签改用SYCL线程本地设备ID缓存。三个后端、两种发布阶段需分别核对,不能合并成统一性能提升或全平台安全结论。

    LangChain JS 适配包更新:MCP与OpenAI提高Zod下限,连接器同步依赖
    LangChain JS 适配包更新:MCP与OpenAI提高Zod下限,连接器同步依赖

    LangChain JS的MCP、IBM、OpenAI及Tavily适配包要求安装Zod 4.6.6及以上,OpenRouter、Together AI、xAI和Neo4j同步相关依赖。本文区分直接安全约束与传递依赖更新,给出锁文件和schema兼容性核对方法。

    LangChain Core 1.8.0:最低 Python 升至3.11,加入决策模型能力
    LangChain Core 1.8.0:最低 Python 升至3.11,加入决策模型能力

    langchain-core 1.8.0结束Python 3.10支持,最低要求变为Python 3.11,并加入decision models。Python 3.10仍会解析到1.7.x;升级前应同时核对解释器、锁文件、CI镜像与部署运行时,不把TypeSafe包的迁移要求混同于全部LangChain包。

    GitHub Copilot CLI 1.0.110-2:压缩遵守会话额度,修复插件设置覆盖
    GitHub Copilot CLI 1.0.110-2:压缩遵守会话额度,修复插件设置覆盖

    GitHub Copilot CLI 1.0.110-2预发布补丁让/compact遵守会话AI credit限制,改进失败回复标记,并修复无效配置时插件操作覆盖其他设置的问题。会话清理会跳过其他进程正在使用的会话,适合核对多终端与插件工作流。

    Ducter 0.0.42:消息定向回复上线,串联密钥卡片与 Mac 手机操作
    Ducter 0.0.42:消息定向回复上线,串联密钥卡片与 Mac 手机操作

    Ducter 0.0.42加入对单条消息及选中文字回复;本轮0.0.39—0.0.41还调整主动提醒、密钥请求卡片及Mac上的手机和应用操作。更新涉及本地权限与远端执行边界,应按版本逐项确认,而非默认所有设备都能使用全部功能。

    Qwen Code 1.0.0-preview.1:修复订阅模型登录,支持 Qoder 并行工具调用
    Qwen Code 1.0.0-preview.1:修复订阅模型登录,支持 Qoder 并行工具调用

    Qwen Code 1.0.0-preview.1修复订阅账号登录后无法使用订阅模型的问题,模型目录随登录状态更新,并同步0.27.x模型目录与思考预算映射。Qoder模型支持并行工具调用;这是预览版补丁,需要单独验证配置兼容。

    OpenCode PTY 0.5.2:发布 protocol 8 终端服务组件
    OpenCode PTY 0.5.2:发布 protocol 8 终端服务组件

    OpenCode发布opencode-pty 0.5.2终端服务组件,使用protocol 8并以@opencode/pty@0.5.2发布到npm。它面向集成终端子进程的开发者,采用MIT许可,仍被项目说明为实验性服务核心,不是OpenCode整款应用的版本号。

    vLLM 0.34.0rc2 源码标签:调整可扩展 KV Cache 测试内存参数
    vLLM 0.34.0rc2 源码标签:调整可扩展 KV Cache 测试内存参数

    vLLM出现0.34.0rc2候选源码标签,关联提交移除多处可扩展KV Cache测试和基准中的固定gpu_memory_utilization设置,并调整相关文档。当前核验的是标签与代码提交,不能将其当作正式版安装包或全局显存默认值变更。

    llama.cpp b12318:新增 CUDA 调试缓冲池与 Sanitizer 说明
    llama.cpp b12318:新增 CUDA 调试缓冲池与 Sanitizer 说明

    llama.cpp b12318新增CUDA调试缓冲池,并补充与compute-sanitizer相关的代码说明。它是面向CUDA开发调试路径的预发布构建,不能据此推断普通推理速度、显存占用或所有后端发生同等变化。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。