RevealTheme logo

正则表达式测试器

针对任意输入测试JavaScript正则表达式。实时查看匹配项、捕获组和替换结果。

0 处匹配

如何使用本工具

  1. 1

    Type your regular expression into the pattern field (no slashes — enter the bare pattern).

  2. 2

    Set the flags in the small field beside it, such as g, i, m, or a combination like gi.

  3. 3

    Paste or type the text you want to search into the large input box below.

  4. 4

    Read the match count and each matched substring with its character index in the results panel; an invalid pattern shows the engine's error message instead.

什么是正则表达式,以及如何读懂它们?

正则表达式(regex)是一种用于在文本中搜索模式的小型领域特定语言。每一种现代编程语言都有正则引擎;本工具使用JavaScript原生的RegExp,它遵循ECMAScript 2018+规范,支持诸如后行断言、命名捕获组、Unicode属性转义和dotAll标志等现代功能。基本构件包括:字面字符匹配其自身(正则'gato'匹配单词gato);字符类匹配某个集合中的任意一个('[a-z]'匹配小写字母);量词控制重复(*零次或多次,+一次或多次,?零次或一次,{3,5}介于3到5次之间);锚点匹配位置(^字符串开头,$结尾,\b单词边界);分组捕获子匹配((gato|perro)匹配任意一个,并捕获是哪一个);选择结构提供二选一。正则表达式擅长解析结构化但非语法性的文本(日志、邮件、电话号码、简单的HTML属性),而对真正递归的结构(完整的HTML、嵌套的JSON)则力不从心。对于那些情况,请使用解析器。本测试器让你能够在即时反馈下迭代某个模式:更改正则表达式,匹配项就会在每次按键时重新计算。

常见使用场景

  • 在发送到服务器之前,校验用户输入的格式(电子邮件、电话号码、邮政编码)。

  • 从日志文件中提取结构化数据(时间戳、IP、状态码、请求路径)。

  • 使用编辑器的正则搜索,在数百个文件中进行查找替换。

  • 为Nginx、Apache .htaccess或Vercel重写编写URL重写规则。

  • 解析那些用真正的解析器显得多余的简单类CSV格式。

  • 为HTML <input pattern="..."> 属性构建表单校验模式。

常见问题

支持哪些标志?
g(global,全局:查找所有匹配项,而不仅是第一个)、i(不区分大小写)、m(multiline,多行:^和$匹配换行)、s(dotAll:.匹配换行)、u(unicode:正确处理多字节字符)、y(sticky,粘性:仅在lastIndex处匹配)。通过将标志连接在一起来组合它们:'gim'同时启用全局+不区分大小写+多行。
我该如何跨多行匹配?
这是两种不同的需求:'m'让^和$匹配换行(将每一行视为锚点的独立字符串)。's'让.匹配换行(否则.会匹配除换行之外的一切)。如果你需要匹配跨行的模式,请将两者一起使用。
贪婪量词和惰性量词有什么区别?
贪婪量词(*、+、{n,m})会尽可能多地匹配。惰性量词(*?、+?、{n,m}?)则尽可能少地匹配。经典例子:正则'<.*>'对'<a><b>'会匹配整个'<a><b>';而'<.*?>'只匹配'<a>'。
我什么时候不应该使用正则表达式?
当结构是真正递归的时候(HTML、JSON、配对的括号)。当你需要正确处理每一种边界情况的时候(解析带时区的日期、含撇号的名字)。当输入的语法定义良好且已有解析库存在的时候。Stack Overflow上一个著名的回答:正则表达式擅长查找模式,却不擅长解析语言。
什么是命名捕获组?
与其让(\d{4})-(\d{2})-(\d{2})返回编号的分组,不如使用(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}),并通过match.groups.year来访问匹配项。在真实代码中可维护性要高得多。
为什么我的正则表达式在某些输入下很慢?
灾难性回溯。嵌套量词如(a+)+在面对对抗性输入时可能耗费指数级的时间。请避免嵌套量词和相互重叠的选择结构。JavaScript引擎没有超时机制,因此一个糟糕的正则表达式可能会挂起一个请求。在生产环境中,请使用npm的safe-regex包来检测有风险的模式。
这里的结果会与我服务器的正则引擎所做的相符吗?
大体上会:主要的正则风格(PCRE、Python的re、Ruby的regex、Java)相似,但存在细微差异。后行断言的语法、字符类的行为以及Unicode的处理各不相同。为了在生产环境中保持一致,也请在目标语言中进行测试。

相关工具