SyntaxError: (irb):4: 后视模式无效(正向后视/前瞻)

Posted

技术标签:

【中文标题】SyntaxError: (irb):4: 后视模式无效(正向后视/前瞻)【英文标题】:SyntaxError: (irb):4: invalid pattern in look-behind (positive look-behind/ahead) 【发布时间】:2021-08-11 03:49:10 【问题描述】:

我正在尝试编写一个正则表达式替换模式来替换哈希中的数字,如下所示:

regexr link

some_dict = 
  TEST: 123

这样可以捕获和替换 123 个。

(?<= |\t*[a-zA-Z0-9_]+: |\t+)\d+(?=.*)

您会发现这在 regexr 中运行良好:

但是,当我在 irb 中运行这个 gsub 时,会发生以下情况:

irb(main):005:0> "  TEST: 123".gsub(/(?<= |\t*[a-zA-Z0-9_]+: |\t+)\d+(?=.*)/, "321")
SyntaxError: (irb):5: invalid pattern in look-behind: /(?<= |\t*[a-zA-Z0-9_]+: |\t+)\d+(?=.*)/

我一直在寻找类似的问题,例如 Invalid pattern in look-behind,但我确保在我的后视中排除捕获组,所以我真的不确定问题出在哪里。

【问题讨论】:

仅供参考:使用 rubular.com 测试 Ruby 正则表达式 【参考方案1】:

原因是 Ruby 的 Onigmo 正则表达式引擎不支持无限宽度的lookbehind 模式。

在一般情况下,包含*+x, 等量词的正向lookbehinds 通常可以替换为后跟\K 的消费模式:

/(?: |\t*[a-zA-Z0-9_]+: |\t+)\K\d+(?=.*)/
#^^^                         ^^  

但是,您甚至不需要那种复杂的模式。 (?=.*) 是多余的,因为它不需要任何东西,.* 甚至可以匹配空字符串。如果当前位置的左侧有空格或制表符,则会触发正向后视模式。正则表达式等于

.gsub(/(?<=[ \t])\d+/, "321")

模式匹配的地方

(?&lt;=[ \t]) - 前面紧跟空格/制表符的位置 \d+ - 一位或多位数字。

【讨论】:

如果有可能出现在123 之后的数字,例如在评论中,我是否还需要添加前瞻? @notacorn 肯定前瞻用于要求特定的字符串上下文。 .* 匹配一个空字符串,因此您的积极前瞻是多余的。

以上是关于SyntaxError: (irb):4: 后视模式无效(正向后视/前瞻)的主要内容,如果未能解决你的问题,请参考以下文章

一元问号 (?) 运算符有啥作用?

VUE3刷新页面报错:Uncaught SyntaxError: Unexpected token ‘<‘

如何在 Ruby 中为 splat 参数设置默认值

linux下让irb实现代码自己主动补全的功能

让irb使用制表符完成

windows上的IRB透明屏幕