1次下午的大部分时间都输给了一个贪婪的量词,我正在为一个WordPress迁移编写重定向地图- 几百个需要重写到新slug的旧网址- 我有一个正则表达式,那就是 假想 to 捕捉每条路径的尾随slug,它工作在我脑海中测试的三个url,它不工作在第四个,它有两个路径段,因为 .* had欢快地吞下了第一个斜线和它之后的一切规则默默地将一半的站点重定向到错误的地方,我从读者那里发现了,而不是从我的测试中,因为我的"测试"盯着模式并信任它。
That is the core problem with regular expressions: they are write-only until you run them against something。a patterns reads as plausible right until the moment real input provides it brong, and the failing modes are quiet。a regex that matching nothing throughs。a regex with a subtly wrong capture group hands you the wrong substring and moved on。a pattern to know a pattern does what you t 看看 在它抓住的东西上。
甲 regex 测试仪 closes that gap。你把你的模式放在一个框中,你的示例文本放在另一个框中,并且每一次匹配都点亮到位 - 随着捕获组的爆发,这样你就可以准确地看到字符串的哪一个切片落在组1与组2。工具z。dev构建的那个在浏览器上运行's原生 RegExp engine,你的javascript和typescript代码使用的也是同一个,所以你在测试仪中看到的就是你在生产中得到的。没有近似值,没有"足够接近。"
本指南涵盖了如何使用测试仪快速调试模式、每个标志的实际作用、捕获组和命名组如何显示在输出中,以及绊倒来自 Python 或 PCRE 的人员的 JavaScript 特定 gotchas。
TL;博士: 将您的图案粘贴到 Toolz.dev Regex 测试仪 (无需斜杠), 切换 g/i/m/s/u/y 标志, 并将测试文本丢在下面 匹配突出显示与交替的颜色现场, 每个编号和命名的捕获组列出每匹配, 语法错误显示引擎's 精确的消息 它使用真正的 JavaScript RegExp 引擎, 运行 100% 客户端如此敏感的日志永不上传, 并与 的配对 正则表达式构建器 用于从头开始组装图案。
如何在不运行整个程序的情况下测试正则表达式?
Regex调试的缓慢方法是我们大多数人从以下环开始:编辑代码中的模式,运行程序,读取输出,猜测出了什么问题,重复。每次迭代都需要运行完整的程序,反馈是间接的 - 你看到的 后果 的比赛,而不是比赛本身。
A tester 崩溃 that loop 到 nothing 你把图案粘贴,粘贴代表性文字,马上看到匹配,当你在图案中改变一个字符,高光更新,这样把反馈收紧到可以的地步 探索- 尝试一个 + 你在哪里有一个 *、加字界,做群非捕捉- 实时观看效果着陆而不是想象。
关键学科正在使用 真实的 test文本,而不是你脑海中干净的例子,破坏我重定向地图的url有两个路径段;我的心理测试案例有一个,如果我把旧url的实际列表粘贴到测试仪中,贪婪匹配在第四行明显错误,抓住实际的日志行,实际的用户输入,实际的文件路径 - 包括丑陋的 - 让测试仪在你的用户之前向你展示模式在哪里崩溃。
Regex 标志实际上会改变什么?
Flags修改了整个模式的应用方式,误解它们是很大一部分"为什么不't这部作品"时刻的背后。的 测试仪 将所有六个 JavaScript 标志暴露为切换,以便您可以翻转一个并观看结果偏移。
g - 全球。 没有它,匹配会在第一击中停止。有了它,引擎就会在文本中找到每场比赛。在测试仪中,global 默认打开,因为您几乎总是想看到所有比赛;关闭它以确认单场比赛的名称是什么样的 String.match 没有 g 会回来。
我--忽略案例。 使整个模式不敏感,所以 error 匹配 Error 並 ERROR。直白,以及g之后最常用的标志。
m-多行。 这个被广泛误解了。确实如此 不是 作出 . 交叉线断裂。它改变了什么 ^ 並 $ 锚定至:与 m,它们在每个开始和结束时匹配 线的,不只是整个字符串的起止,如果你're在日志中逐行匹配,你想要这个。
s-dotall。 这就是制作的旗帜 . 匹配换行符。没有它, . 匹配任何角色 除 a 换行,这就是为什么一个要跨多条线的模式经常在第一个静静地停下来,如果你的匹配应该跨越线界, s 是你需要的 - 不是 m。
u-x-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10- 统一码。 启用完整的 Unicode 模式,这使得 \u{...} escapes工作,把代理对当作单一代码点,并使角色类像 \p{Letter} 可用。当您的文本有表情符号或非拉丁文字时,这一点很重要。
y-粘稠的。 每场比赛的锚都会尝试精确的位置 lastIndex(so matching)只有在精确开始的地方才会成功,它's 标记器和解析器中使用的利基标志;大多数日常工作从不触及它。
花费最多时间的混乱是 m 对比 s。人们在表示dotAll的时候伸手去做多行,如果你的点't交叉线,你需要 s。如果你的主播是't命中线边界,你需要 m.它们解决不同的问题,经常一起使用。
输出中如何显示捕获组?
模式中的括号做两份工作:它们对量词或交替的子模式进行分组,并且它们 捕获 the matched slice进行提取 当你're用正则表达式从文本中拉出数据-一个日期's年月,一个日志行's时间戳和级别-捕获组是整个点,弄错是"模式匹配但我弄错了字符串"最常见的来源
的 测试仪 lists每一个匹配与它的捕获组在其下方爆发。1组是第一个括号的子模式,2组是第二个,依此类推,每个显示与它为该匹配捕获的确切文本。这使得组边界错误很明显:如果1组抓取的比你预期的要多,你可以看到它并拉入括号。
命名的群体得到同样的待遇。当你写作时 (?<year>\d{4})-(?<month>\d{2})、测试人员按名称显示捕获 - <year> 並 <month>- 除了编号的等价物之外,您还可以在依赖之前确认名称映射到您想要的切片 match.groups.year in code。named groups使模式自文档化和代码更具可读性,看到它们在测试仪中正确解析是信任它们的最快方法。
A相关的陷阱测试仪表面:一个组,它参与模式,但没有't匹配在给定的尝试显示为"不匹配"而不是空字符串。那个区别很重要,因为在JavaScript中这样一个组是 undefined(和假设它的代码)'s总是会抛出一个字符串,看到它在测试仪中标记告诉你要守卫那个访问。
这是哪种雷格克斯口味?为什么这很重要?
正则表达式不是一种语言。Python's 中工作的模式 re javascript 中,模块可以表现不同 - 或抛出 -,反之亦然。这个 测试仪 使用 JavaScript (ECMAScript)引擎内置到你的浏览器中,这是字节对字节的相同引擎 Node。js 运行。所以如果你're编写JavaScript,TypeScript或Node代码,这里的结果正是你的代码将要做的。
这种精度是双向切割的。如果您从为 PCRE 编写的堆栈溢出答案中复制模式(PHP 和) preg_ wordpress工作中我不断使用的函数)或对于python,一些特征赢了't翻译。javascript历史上缺乏背后视角的断言,获得它们相对最近,并且仍然以不同的方式处理一些unicode属性逃逸。来自pcre的所有权量词和原子群don't存在于javascript中根本不存在递归- 一个用于匹配嵌套结构的pcre功能- 没有javascript等价物。
实用结果:在风味中进行测试 you'll 部署在。忠实实现一个引擎的测试器比实现所有引擎的模糊平均值更有用,因为 "它在测试器中工作"需要表示"它将在我的代码中工作。"对于 PHP 和 WordPress 工作,我牢记差异并单独验证服务器端;对于任何 JavaScript,这个测试器 於 thrue的来源。the中涵盖了这种语言感知验证的更广泛的工具包 编码工具指南。
Regex 测试仪的日常用途是什么?
构建和调试验证模式
Email字段,电话号码,邮政编码,slugs,语义版本字符串 - 每个表单都验证某件事,验证通常是正则表达式。测试仪让您在模式发货前将尴尬的案例抛向模式:带有加地址标签的电子邮件,带有扩展名的电话号码,版本字符串喜欢 1.10.0 that 天真的模式截断。粘贴一列真实值,并观察哪些值不匹配。
从日志中提取数据
Server 日志、应用程序日志、CSV 导出是半结构化的文本,regex 是你从中拉出字段的方式 捕获组抓取时间戳、级别、请求 ID 测试器's 每场比赛分组细分正是你在这里需要的视图 - 粘贴十几条真实的日志行,并确认每个字段在正确的组中跨过所有字段,而不仅仅是整洁的第一行 这与 API调试工作流程 响应体和标头被抓取特定值。
跨代码库搜索和替换
编辑器和 IDE 支持查找和替换正则表达式,那里的糟糕模式可以重写远远超出预期。测试 比赛 side in a designed tester before you run the replace is ceaple insurance - see quite what the pattern selected across a responsent sample, then run the replace with confidence。My redirect-map disaster was fundamentally a find-and-replace that I never tested from real input first。
学习和教学正则表达式
Live高亮,让测试者成为正版学习工具,一次一个令牌构建一个模式,看着匹配集随着你添加锚、量词、类而缩小和增长,看到 \d+ 抓住一个整数,然后 \d grab one pigit 比任何散文解释都更能理解,当你'准备好从组件中组装一个模式而不是调试一个现有的模式时,the 正则表达式构建器 是配套工具。
如何避免零长度比赛陷阱?
个可以匹配空字符串的模式- a*、 \d*、 (foo)?-can "match"在字符之间的每个位置,产生大量空匹配。天真的匹配代码不会't永远超过零长度匹配循环。 测试仪 通过始终前进来防止内部这种情况,因此它永远不会悬挂,但它会悬挂 表演 你们这些空匹配。
That 显示器是一个功能,而不是噪音,一堆空匹配是测试人员告诉你你的量词太宽容了,如果你是说"一个或多个数字,"你写的 \d* 当你想要的时候 \d+.如果需要一个组,你将其标记为可选的 ?、看到空匹配是把你指向修复的诊断,当你的模式正确时,匹配是你关心的子串,没有别的。
JavaScript Regex 与其他口味:快速比较
| 特点 | JavaScript(此测试器) | PCRE (PHP) | Python re |
|---|---|---|---|
| 命名组 | (?<name>...) |
(?<name>...) 或 (?P<name>...) |
(?P<name>...) |
| 看看后面 | 撑(现代发动机) | 支持 | 支持 |
| 原子群/所有格 | 不支持 | 支持 | 有限公司 |
| 递归 | 不支持 | 支持 | 不支持 |
| 点匹配换行标志 | s (点全部) |
s (多托尔) |
re.DOTALL |
Unicode 属性 \p{...} |
要求 u 旗 |
要求 u 修饰语 |
regex 仅模块 |
| 粘性匹配 | y 旗 |
\G 锚 |
\G-比如通过 match 位置 |
表's教训是"regex"是一个家庭,而不是一个标准语法重叠到足以让你跨语言复制模式,而差异正是你在硬问题上达到的高级功能,在你的目标味道中测试对于JavaScript和Node,that's这个测试仪;the web开发人员工具包 涵盖其他特定语言工具适合的位置。
测试 Regex 对抗敏感文本安全吗?
Regex测试的文本通常是敏感的类型:带有IP地址和用户ID的生产日志行,带有电子邮件地址的导出,带有内部主机的配置文件。那's正是你的数据 应该't 粘贴到将其运送到服务器的工具中。
的 Toolz.dev Regex 测试仪 完全在您的浏览器中运行。模式编译、匹配、组提取 - 所有这些都是客户端 JavaScript,没有任何网络请求在任何地方携带您的模式或文本。页面加载后切断您的连接,它继续工作。那's 架构保证,而不是隐私政策句子,它's 相同的浏览器优先原则,在集合中的每个工具后面,布局 数据隐私指南。
这意味着您可以粘贴真实的日志行 - 具有实际 PII 的日志行,从而形成模式's 边缘情况出现 - 并安全地对其进行调试。那's 整点:测试仪只有在您向其提供真实输入时才有用,而真实输入通常正是您可以't 发送给其他's 服务器。
常问问题
如何在线测试正则表达式?
在没有周围斜杠的模式字段中输入您的模式,选择您的标志,并将示例文本粘贴到测试区域。匹配立即突出显示,并为每场比赛列出捕获组。一切都在您的浏览器中运行 - 没有上传任何内容。
这个测试仪使用什么正则表达式?
它使用浏览器中内置的 JavaScript (ECMAScript) RegExp 引擎,该引擎与 Node。js 中的引擎相同。结果与 JavaScript 和 TypeScript 中相同模式的行为方式相匹配。 JavaScript regex 与 PCRE、Python's re 模块以及原子群和递归等一些高级功能中的 Java 模式不同,因此请测试您将部署的风味。
正则表达式标志 G、I、M 和 S 是什么意思?
g(全局)标志找到所有匹配而不是停在第一个。i标志使匹配大小写不敏感。m(多行)标志使^和$锚匹配在换行而不是只有字符串开始和结束。s(dotAll)标志让点匹配换行字符也。m和s标志经常被混淆 - m改变锚,s改变点。
捕获组如何在测试仪中工作?
Partheses 在你的模式中创建捕获组,测试人员将每个编号的组与它为每个匹配捕获的文本一起列出,这样你就可以验证抓取的模式的每个部分字符串的哪一个切片被命名为(?)的组...)与编号组一起显示名称。
为什么我的正则表达式不匹配或抛出错误?
1个什么都不匹配的模式通常有过特定字符或像字面点或加号一样的未转义特殊字符,抛出错误的模式有语法问题,如不平衡的括号或括号,测试人员显示引擎's精确的错误消息,这样你就可以快速定位问题。
如何跨多行匹配?
启 s(dotAll)标志,如果你需要点来跨越换行符,并且如果你希望在每行开始和结束时匹配^和$锚点,则启用 m(多行)标志。将两者结合起来,让单个模式像日志或CSV行一样自然地针对多行输入工作。
对敏感数据进行正则表达式测试是否安全?
是所有匹配都发生在浏览器内部的 JavaScript 中 - 没有任何模式或测试文本发送到任何服务器,没有记录任何内容,并且该工具在您的连接被禁用的情况下工作。您可以安全地针对日志文件、个人数据或专有格式进行测试。
正则表达式测试仪和正则表达式构建器有什么区别?
Regex 测试仪针对文本运行一个现有的模式,这样你就可以验证和调试它,而 Regex 构建器则帮助你从组件或常用模板构建一个模式,使用本站点上的 Regex 构建器组装一个模式,然后将其带到测试仪上,对照真实的样本数据进行检查。
正则表达式保持只写状态,直到您针对真实输入运行它们,并且失败很安静 - 没有匹配,匹配过多,捕获的组错误,并且没有错误告诉您。测试人员将模式变为可见: 粘贴您的正则表达式、喂它丑陋的真实文本,并在生产中准确地观察它抓住了什么,然后才抓住了错误的东西。



