正则表达式测试工具
在你的设备上运行,不会发送任何内容。一切都在您自己的设备上完成。您输入的任何内容都不会被发送到任何地方。
标志
常见模式
测试字符串
未找到匹配项
解释
在上方输入一个模式,查看每个部分的作用说明
在浏览器本地实时高亮匹配结果,测试、解释并调试 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——两者都会自动预填。大多数访问者不需要这个功能;它是为了直接链接到一个可用的示例。