
教程【免费下载链接】learn-regexLearn regex the easy way项目地址https://gitcode.com/gh_mirrors/le/learn-regex点击查看免费下载正则表达式Regular Expression简称 regex / regexp是一组用于在文本中查找特定模式的字符或符号广泛应用于文本替换、表单校验、按模式从字符串中提取子串等场景。本文以 learn-regex 开源教程仓库 translations/README-tr.md 为土耳其语母版英文原版见 README.md为核心系统讲解从最基础的字符匹配到元字符、字符集、重复、捕获组、锚点、前后查找、标志Flags以及贪婪与惰性匹配的完整知识体系并配以可复制运行的真实示例。读完本文你将能够独立读懂常见正则表达式、写出用户名校验等实用模式并掌握在编程语言与命令行工具中使用正则的基本方法。首先以一个最贴近日常开发的例子直观感受正则表达式编写应用时我们往往需要为「用户名」设定规则——允许字母、数字、下划线和连字符并限制总长度避免输入太丑。以下正则即可完成该校验这条正则^[a-z0-9_-]{3,15}$可以接受john_doe、jo-hn_doe、john12_as这样的输入而Jo无法匹配因为它包含大写字母字符集只允许小写字母且长度不足 3 个字符。下面我们把这幅图拆解成每一个组成部分逐一掌握。1. 基础匹配器Basic Matchers正则表达式本质上就是一个用于在文本中搜索的字符模式。例如正则the表示字母t后面跟着h再后面跟着e引擎会从左到右把正则中的每个字符与输入文本中的每个字符逐一比较。the The fat cat sat on strongthe/strong mat.正则123匹配字符串123。需要记住正则默认是大小写敏感的因此The不会匹配theThe strongThe/strong fat cat sat on the mat.也就是说The只会在文本中恰好出现大写T时命中。2. 元字符Meta Characters元字符是正则表达式的构建基石。它们并不代表自身而是以特殊方式被解释。部分元字符具有特殊含义并写在方括号内使用。完整清单如下元字符说明.匹配除换行符外的任意单个字符[ ]字符类匹配方括号内的任意一个字符[^ ]取反字符类匹配不在方括号内的任意字符*匹配前面符号的 0 次或更多次重复匹配前面符号的 1 次或更多次重复?使前面的符号成为可选0 或 1 次{n,m}花括号量词匹配前面符号至少 n 次、至多 m 次(xyz)字符组按该精确顺序匹配 xyz\|交替匹配该符号之前或之后的表达式\转义下一个字符允许匹配保留字符[ ] ( ) { } . * ? ^ $ \ \|^匹配输入的开始位置$匹配输入的结束位置下面逐一深入每个元字符的用法。2.1 点号The Full Stop.是最简单的元字符它匹配任意单个字符但不匹配回车或换行。例如.ar表示任意一个字符后面跟着a再后面跟着r.ar The strongcar/strong strongpar/strongked in the stronggar/strongage.可以看到car、par、gar都被命中因为它们都由任意字符 ar构成。2.2 字符集Character Sets字符集也叫字符类Character Class用方括号[ ]指定。可以在字符集内使用连字符-表示字符范围且方括号内范围书写的顺序无关紧要。例如[Tt]he表示大写T或小写t后面跟着h、e[Tt]he strongThe/strong car parked in strongthe/strong garage.一个容易忽略的细节字符集内部的点号是字面意义上的点。正则ar[.]表示小写a后跟r再跟一个句点.字符——这里的.不再具备任意字符的含义ar[.] A garage is a good place to park a cstrongar./strong2.2.1 取反字符集Negated Character Sets一般情况下^表示字符串开始但当它紧跟左方括号书写时表示对字符集取反。例如[^c]ar表示除c之外的任意字符后面跟着a、r[^c]ar The car strongpar/strongked in the stronggar/strongage.这里car中的c被排除因此不匹配而par、gar匹配。2.3 重复Repetitions元字符、*、?用来指定子模式可以出现多少次它们在不同情境下表现不同。2.3.1 星号The Star*匹配前面匹配器的 0 次或更多次重复。正则a*表示小写a的 0 次或多次重复但如果它出现在字符集或字符类之后则作用于整个字符集的重复。例如[a-z]*表示一行中任意数量的小写字母[a-z]* Tstronghe/strong strongcar/strong strongparked/strong strongin/strong strongthe/strong stronggarage/strong #21.*与.组合成.*可匹配任意字符串与空白字符\s组合可匹配一串空白。例如\s*cat\s*表示0 个或多个空格后跟c、a、t再跟 0 个或多个空格\s*cat\s* The fatstrong cat /strongsat on the constrongcat/strongenation.注意这里两个命中一个是带前后空格的cat\s*匹配了前后空格一个是单词内部的cat。2.3.2 加号The Plus匹配前面字符的 1 次或更多次重复。例如c.t表示小写c后跟至少一个任意字符再跟小写t。需要特别说明这里的t是句子中的最后一个tc.t The fat strongcat sat on the mat/strong.因为.是贪婪匹配它会一路延伸到句子末尾的t上。2.3.3 问号The Question Mark?使前面的字符变为可选匹配前面字符的 0 次或 1 次。例如[T]?he表示可选的大写T后跟h、e。对比下面两条结果可以清楚看到?的作用[T]he strongThe/strong car is parked in the garage.[T]?he strongThe/strong car is parked in tstronghe/strong garage.不加?时[T]he只能匹配The加了?后The和单词中的he都能命中。2.4 花括号Braces花括号又称量词 Quantifiers用来指定某个字符或字符组可以重复的次数。例如[0-9]{2,3}表示匹配 0 到 9 范围内的数字至少 2 位、至多 3 位[0-9]{2,3} The number was 9.strong999/strong7 but we rounded it off to strong10/strong.0.第二项可以省略。[0-9]{2,}表示匹配 2 位或更多位数字如果连逗号也去掉[0-9]{3}表示恰好匹配 3 位数字[0-9]{2,} The number was 9.strong9997/strong but we rounded it off to strong10/strong.0.[0-9]{3} The number was 9.strong999/strong7 but we rounded it off to 10.0.对比可知{2,}匹配了 4 位数字9997而{3}只匹配前 3 位999剩余7不构成完整命中10因不足 3 位也不匹配。2.5 捕获组Capturing Groups捕获组是写在圆括号(...)中的一组子模式。之前提到量词放在单个字符后会重复前面的字符而量词放在捕获组后则重复整个捕获组。例如(ab)*匹配字符串 ab 的 0 次或更多次重复。捕获组内部还可以使用交替元字符|。例如(c|g|p)ar表示小写c、g或p后跟a、r(c|g|p)ar The strongcar/strong is strongpar/strongked in the stronggar/strongage.需要特别注意的是捕获组不仅匹配还会捕获匹配到的字符供宿主语言使用——宿主语言可以是 Python、JavaScript 或几乎任何在函数定义中实现了正则表达式的语言。例如在 JavaScript 中可用match结果的数组下标如$1、$2或 Python 中re.search(...).group(1)取出捕获内容。2.5.1 非捕获组Non-Capturing Groups非捕获组是匹配字符但不捕获的分组在圆括号内以?后跟:表示即(?:...)。例如(?:c|g|p)ar与(c|g|p)ar匹配的字符完全相同但不会创建捕获组(?:c|g|p)ar The strongcar/strong is strongpar/strongked in the stronggar/strongage.非捕获组在「查找并替换」功能中或与非捕获组混用时保持输出结构清晰、避免产生多余捕获编号时非常有用。2.6 交替Alternation正则中的竖线|用于定义交替它相当于多个表达式之间的或OR关系。你可能会想字符集和交替不是一样的吗关键区别在于——字符集工作在字符级别而交替工作在表达式级别。例如(T|t)he|car表示(大写T或小写t后跟h、e) 或者 (小写c后跟a、r) 两种情况之一成立即命中(T|t)he|car strongThe/strong strongcar/strong is parked in strongthe/strong garage.圆括号在这里用于明确分组标明括号内任一表达式满足即可整体匹配。2.7 转义特殊字符Escaping Special Characters反斜杠\在正则中用于转义下一个字符使我们能把保留字符{ } [ ] / \ * . $ ^ | ?当作普通匹配字符使用。例如.本来用于匹配除换行外的任意字符若要在输入中匹配字面上的句点就必须转义它。正则(f|c|m)at\.?表示小写f、c或m后跟a、t再跟一个可选的.字符(f|c|m)at\.? The strongfat/strong strongcat/strong sat on the strongmat./strong注意fat、cat后无句点也命中因为\.可选而mat.命中了包含句点的完整形式。2.8 锚点Anchors锚点用于检查匹配符号是否是输入字符串的开始符号或结束符号共两类脱字符^检查匹配字符是否为输入的第一个字符美元符$检查匹配字符是否为输入的最后一个字符。2.8.1 脱字符The Caret^用于检查匹配字符是否为输入字符串的第一个字符。对字符串abc应用^a即a必须是起始字符会命中a而应用^b则一无所获因为abc中b不是起始字符。再看正则^(T|t)he——大写T或小写t必须是字符串第一个字符后跟h、e。对比有无^的结果差异明显(T|t)he strongThe/strong car is parked in strongthe/strong garage.^(T|t)he strongThe/strong car is parked in the garage.加上^后只有位于句首的The命中句中的the不再匹配。2.8.2 美元符号The Dollar Sign$用于检查匹配字符是否为字符串的最后一个字符。例如(at\.)$表示小写a后跟t再跟.且该匹配必须位于字符串末尾(at\.) The fat cstrongat./strong sstrongat./strong on the mstrongat./strong(at\.)$ The fat cat. sat. on the mstrongat./strong加上$后只有位于整个输入末尾的at.命中中间的cat.、sat.不再匹配。3. 速记字符集Shorthand Character Sets正则提供了一批针对高频字符集的便捷速记速记说明.除换行外的任意字符\w匹配字母数字字符[a-zA-Z0-9_]\W匹配非字母数字字符[^\w]\d匹配数字[0-9]\D匹配非数字[^\d]\s匹配空白字符[\t\n\f\r\p{Z}]\S匹配非空白字符[^\s]回顾文首的用户名校验正则^[a-z0-9_-]{3,15}$其中[a-z0-9_-]正是字符集与范围语法的组合应用而\w、\d等速记则是对此类常见范围的进一步抽象。注意速记的大写形式表示取反如\W与\w相反这一规律在编程中非常实用。4. 前后查找Lookarounds后顾Lookbehind与前瞻Lookahead合称前后查找Lookaround它们是一种特殊的非捕获组——用于匹配某个模式但不把该模式计入匹配结果。前后查找适用于某个模式必须被另一个模式前置或后置的场景。例如要从字符串$4.44 and $10.88中取出所有以$开头的数字可使用正则(?\$)[0-9\.]*其含义是获取所有包含.字符、且前面有$字符的数字。正则中常用的前后查找符号如下符号说明?正向先行断言Positive Lookahead?!负向先行断言Negative Lookahead?正向后行断言Positive Lookbehind?!负向后行断言Negative Lookbehind4.1 正向先行断言Positive Lookahead正向先行断言断言表达式的前半部分必须被断言表达式所跟随但返回的匹配结果只包含前半部分命中的文本。定义方式是在圆括号内使用问号加等号(?...)断言表达式写在圆括号内等号之后。例如(T|t)he(?\sfat)表示匹配T或t后跟h、e且后面必须紧跟空格 fat(T|t)he(?\sfat) strongThe/strong fat cat sat on the mat.只有The命中——因为只有它后面跟着fat句末的the后面没有跟fat因此不匹配。4.2 负向先行断言Negative Lookahead负向先行断言用于获取不被某个模式跟随的所有匹配。写法与正向先行断言相同区别仅在于把换成!(?!...)。例如(T|t)he(?!\sfat)表示获取所有后面没有跟空格 fat的The或the(T|t)he(?!\sfat) The fat cat sat on strongthe/strong mat.这一次反过来The因后跟fat而不匹配句末的the命中。4.3 正向后行断言Positive Lookbehind正向后行断言用于获取所有被某个特定模式前置的匹配写法为(?...)。例如(?(T|t)he\s)(fat|mat)表示获取所有出现在The或the含空格之后的fat或mat(?(T|t)he\s)(fat|mat) The strongfat/strong cat sat on the strongmat/strong.The fat中的fat和the mat中的mat命中cat与sat因不在断言之后而不在匹配结果中。4.4 负向后行断言Negative Lookbehind负向后行断言用于获取所有不被某个特定模式前置的匹配写法为(?!...)。例如(?!(T|t)he\s)(cat)表示获取所有没有出现在The或the之后的cat(?!(T|t)he\s)(cat) The cat sat on strongcat/strong.开头的cat跟在The之后不匹配句末的cat命中。5. 标志Flags标志Flags也叫修饰符Modifiers因为它们会修改正则表达式的输出行为。标志可以按任意顺序、任意组合使用是 RegExp 的有机组成部分标志说明i大小写不敏感匹配对大小写不敏感g全局搜索匹配所有实例而不仅是第一个m多行锚点元字符在每一行上生效5.1 大小写不敏感Case Insensitivei修饰符用于执行大小写不敏感的匹配。例如/The/gi表示大写T后跟h、e结尾的i让引擎忽略大小写同时配合了g标志因为我们想在整个输入串中搜索该模式。对比效果The strongThe/strong fat cat sat on the mat./The/gi strongThe/strong fat cat sat on strongthe/strong mat.加上gi后句中的小写the也被命中。5.2 全局搜索Global Searchg修饰符用于全局匹配找出所有匹配而不是在第一个匹配后就停止。例如/.(at)/g表示除换行外的任意字符后跟a、t。因为末尾提供了g引擎会找出输入中所有匹配而非默认只找第一个/.(at)/ The strongfat/strong cat sat on the mat./.(at)/g The strongfat/strong strongcat/strong strongsat/strong on the strongmat/strong.无g时只命中第一个fat加g后fat、cat、sat、mat全部命中。5.3 多行Multilinem修饰符用于执行多行匹配。前面讲过锚点(^, $)用于检查模式是否在输入的开始或结束位置而如果希望锚点在每一行都生效就需要m标志。例如/at(.)?$/gm表示小写a后跟t之后可选地跟随除换行外的任意字符由于m标志引擎会匹配输入中每一行末尾的模式/.at(.)?$/ The fat cat sat on the strongmat./strong/.at(.)?$/gm The strongfat/strong cat strongsat/strong on the strongmat./strong不加m时只匹配整个输入的末尾mat.加gm后每行末尾的fat、sat、mat.都命中。6. 贪婪与惰性匹配Greedy vs Lazy Matching默认情况下正则执行贪婪匹配——匹配结果尽可能长。可以通过在量词后加?实现惰性匹配——匹配结果尽可能短。经典的对比示例/(.*at)/ strongThe fat cat sat on the mat/strong..*贪婪地延伸到最后一个at整句话都被匹配。/(.*?at)/ strongThe fat/strong cat sat on the mat.加上?后变成惰性匹配.*?在找到第一个满足条件的at后就停止结果缩短为The fat。这一机制在解析 HTML、日志文本等场景中尤为关键贪婪匹配往往误伤过多内容而惰性匹配如.*?能精确收敛到目标片段。小结与继续深入至此我们已走完 learn-regex 教程的完整主线从基础匹配器到元字符体系点号、字符集、取反字符集、重复、花括号量词、捕获组与非捕获组、交替、转义、锚点再到速记字符集、前后查找四大断言、三大标志i/g/m以及贪婪与惰性匹配。用本文开头的用户名校验正则^[a-z0-9_-]{3,15}$做个复盘正好串联起本教程的核心知识^与$锚点要求从行首到行尾整串匹配[a-z0-9_-]字符集 范围语法限定允许的字符小写字母、数字、下划线、连字符{3,15}花括号量词限定长度在 3 到 15 个字符之间。本仓库是 MIT 协议下开源的教程型项目LICENSE.md英文主文档为 README.md本文所依据的土耳其语版位于 translations/README-tr.md其余多语言翻译德、西、法、中、日、韩、俄、越南、希伯来、匈牙利、波兰等也收录在 translations 目录中可对照学习。文中所有示例均可直接在支持正则的调试工具或您所使用的编程语言环境中运行验证建议在动手实践时逐步叠加g、i、m等标志观察匹配结果的差异这是快速内化正则语法的有效方式。赞分享教程【免费下载链接】learn-regexLearn regex the easy way项目地址https://gitcode.com/gh_mirrors/le/learn-regex点击查看免费下载相关推荐learn-regex 正则表达式入门实战指南从基础匹配到贪婪与惰性learn regex 正则表达式入门实战指南从基础匹配到贪婪与惰性 正则表达式Regular Expression简称 regex / regexp是教程learn-regex 正则表达式入门实战指南从基础匹配到环视与贪婪/懒惰匹配learn regex 正则表达式入门实战指南从基础匹配到环视与贪婪/懒惰匹配 正则表达式Regular Expression简称 regex 或 reg教程OpenStatus Server 部署与 MCP 注册指南基于 Deno Hono 的 API 服务实战OpenStatus Server 部署与 MCP 注册指南基于 Deno Hono 的 API 服务实战 OpenStatus 的 Server 应用教程上一篇BiSheng JDK性能测试工具对比cHeapUsage vs metaSpaceUsage - 内存监控双剑客下一篇CefFlashBrowserFlash时代终结后的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考