正则表达式测试器

正则表达式(regex)是用于匹配文本的模式。此工具分析 regex 语法,解释模式组件,并提供测试区域来尝试对示例文本进行匹配。支持 JavaScript、PCRE 和 Python regex 格式。

规范

常见用例

  • 调试 regex 未匹配预期文本的原因
  • 通过查看解释来学习 regex 语法
  • 在添加到代码之前测试模式
  • 验证表单字段的输入模式
  • 从结构化文本中提取数据(日志、CSV、HTML)

功能

  • 检测 regex 格式(JavaScript /pattern/flags、PCRE #pattern#、Python r"pattern")
  • 用通俗语言解释模式组件
  • 对示例文本进行测试并高亮匹配结果
  • 单次匹配或查找所有匹配模式
  • 显示捕获组及其内容
  • 命名捕获组显示
  • 显示匹配位置和索引
  • regex 执行时间显示
  • 模式特征标签(锚点、量词等)
  • 模式警告
  • 常用模式库(电子邮件、URL、电话等)

示例

电子邮件模式

试试看 →

用于匹配电子邮件地址的 regex。

/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/i

URL 模式

试试看 →

用于匹配 HTTP/HTTPS URL 的 regex。

/https?:\/\/[^\s]+/g

日期模式

试试看 →

用于匹配 YYYY-MM-DD 日期的带捕获组的 regex。

/(\d{4})-(\d{2})-(\d{2})/

提示

  • 在生产环境使用前,使用在线测试器调试复杂模式。
  • 使用反斜杠转义特殊字符(. ^ $ * + ? { } [ ] \ | ( ))。
  • 命名捕获组 (?<name>...) 使匹配结果更易读。
  • g 标志查找所有匹配;没有它则只返回第一个匹配。
  • 小心贪婪量词(* +);在适当时使用非贪婪量词(*? +?)。

理解 正则表达式测试器

正则表达式(regex)是一种模式匹配语言,几乎在所有编程语言、文本编辑器和命令行工具中都有使用。regex 使用字面字符和元字符的组合定义搜索模式,用于匹配字符串类。它们对于输入验证、文本提取、搜索替换操作和日志分析是不可或缺的。

核心语法包括字符类([a-z]、\\d、\\w、\\s)、量词(*、+、?、{n,m})、锚点(^、$、\\b)、交替(|)和括号分组。捕获组提取匹配的子字符串并启用反向引用。前瞻 (?=...) 和后顾 (?<=...) 在不消耗字符的情况下匹配位置,允许对周围上下文进行复杂断言。

JavaScript regex 有自己的方言,带有特定标志:g(全局)、i(不区分大小写)、m(多行)、s(dotAll)、u(Unicode)和 y(粘性)。u 标志对于正确处理 Unicode 文本越来越重要,因为没有它,模式可能无法正确匹配多字节字符。命名捕获组 (?<name>...) 比编号组更具可读性。

常见的 regex 任务包括电子邮件验证、URL 解析、从结构化文本(日志文件、CSV)中提取数据以及在代码重构中替换模式。然而,regex 有其局限性——它无法解析嵌套结构如 HTML 或 JSON(请使用专门的解析器),过于复杂的模式会变得不可读且难以维护。"现在你有两个问题了"这个笑话反映了复杂 regex 的实际维护挑战。

HTML 是一种具有嵌套结构的上下文无关语言,正则表达式从根本上无法处理。regex 无法正确匹配具有任意嵌套深度的开标签和闭标签。简单的情况可能看起来有效,但在涉及嵌套标签、包含 > 的属性或注释的边缘情况下会失败。对于 HTML 处理,请使用 DOM 解析器,如浏览器中的 DOMParser、Node.js 的 cheerio 或 Python 的 BeautifulSoup。

.*(贪婪)和 .*?(懒惰)量词之间的区别对匹配行为有重要影响。贪婪的 .* 尽可能多地匹配字符,然后在需要时回溯。懒惰的 .*? 尽可能少地匹配字符。在字符串 "<b>一</b><b>二</b>" 中,贪婪模式 <b>.*</b> 匹配整个字符串,而懒惰模式 <b>.*?</b> 只匹配第一个 "<b>一</b>"。选择错误的模式是导致意外 regex 行为的最常见原因之一。

在 JavaScript 中,u 标志(/pattern/u)启用 Unicode 感知匹配。没有它,元字符 . 不匹配基本多语言平面之外的字符(如表情符号),\\w 只匹配 ASCII 字母字符。u 标志使量词和字符类正确处理代理对,并启用 Unicode 属性转义如 \\p{Letter}。前瞻 (?=...) 和后顾 (?<=...) 是零宽断言,在某个位置检查模式但不将其包含在匹配中。正向前瞻 (?=...) 断言后面必须跟什么,而负向前瞻 (?!...) 断言后面不能跟什么。例如,\\d+(?= dollars) 匹配后面跟着 " dollars" 的数字,但只捕获数字本身。后顾的工作方式相同,但检查的是前面的文本。

← 返回所有工具