Tarayıcınız güncel değil

Bu siteyi görüntülemek için tarayıcınızın veya cihazınızın işletim sisteminin güncellenmesi gerekiyor.

Your browser is out of date. Please update iOS or your browser to view this site.

跳转到主要内容
Gizke.com
博客

正则表达式测试工具

在你的设备上运行,不会发送任何内容。

标志

常见模式

测试字符串

未找到匹配项

解释

在上方输入一个模式,查看每个部分的作用说明

在浏览器本地实时高亮匹配结果,测试、解释并调试 JavaScript 正则表达式。

正则表达式(regex)是一种用于匹配、查找或替换文本的模式 - 它是代码编辑器中的查找替换、表单校验以及日志解析背后的同一套基础工具。此测试工具直接在您的浏览器中运行 JavaScript 原生的正则表达式引擎:输入一个模式和一段测试文本,它就会高亮每一个匹配项、拆解捕获组、预览替换结果,并用通俗的语言解释模式中每一部分的作用。您输入的任何内容都不会被上传到任何地方。

常见问题

这里使用的是哪种正则表达式方言?
JavaScript 内置的正则表达式引擎(即 RegExp 以及 String.prototype.match/replace 背后所用的引擎),因为这里的一切都在您的浏览器中于客户端运行,而非在服务器上运行。它与 PCRE 非常接近,但存在一些差异 - 例如,后行断言(lookbehind)的支持取决于引擎版本,命名分组使用 (?<名称>...) 语法。
为什么我的模式只匹配一次?
默认情况下,在没有 g(全局)标志时,正则表达式会在第一次匹配后停止 - 这与 JavaScript 中 RegExp.exec() 和 String.match() 的实际行为一致。请在上方启用 g 标志,以查找测试字符串中的所有匹配项,而不仅仅是第一个。
(...) 和 (?:...) 有什么区别?
两者都会将模式的一部分组合在一起,但只有 (...)(捕获组)会保存其匹配到的内容,以便您之后引用(在替换中作为 $1、$2……,或出现在匹配结果的分组列表中)。(?:...) 是非捕获组:它进行分组并应用量词,但不保留匹配内容 - 当您需要分组但不关心被捕获的文本时很有用。
命名分组和 $<名称> 替换是如何工作的?
使用 (?<名称>...) 而非 (...) 来以名称而非仅仅是数字来捕获一个分组。在替换模式下,在替换文本中以 $<名称> 引用它 - 例如,将 (?<year>\d{4})-(?<month>\d{2}) 替换为 $<month>/$<year>,即可在无需记住分组编号的情况下重新排列日期。
贪婪(greedy)量词和懒惰(lazy)量词有什么区别,比如 + 和 +??
贪婪量词(+、*、{2,4})会尽可能多地匹配,只有在需要让模式的其余部分匹配成功时才会回退。懒惰量词 - 同样的符号后面加上 ? - 则恰恰相反,会尽可能少地匹配,只有在必要时才逐字符扩展。例如,<.+> 对 <a><b> 会贪婪地匹配整个 <a><b>,而 <.+?> 则懒惰地只匹配 <a>。
如果先行断言和后行断言(lookahead/lookbehind)不消耗任何字符,它们实际上在检查什么?
它们检查某个模式是否恰好出现在当前位置之前或之后,但不会把这部分内容包含进匹配结果本身 - 因此 (?=...) 和 (?<=...) 是在向前/向后检查某个内容必须存在,而 (?!...) 和 (?<!...) 则检查它必须不存在。这就是为什么你可以用 \d+(?=px) 只匹配后面跟着“px”的数字,而“px”本身永远不会出现在匹配到的文本中。
面向开发者:在网址中加上 `q`(正则表达式)和 `text`(测试文本)参数打开此页面——例如 gizke.com/regex?q=\d+&text=There are 42 apples——两者都会自动预填。大多数访问者不需要这个功能;它是为了直接链接到一个可用的示例。

分享此工具

博客关于联系我们使用条款隐私政策