繁体   English   中英

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

[英]SyntaxError: (irb):4: invalid pattern in look-behind (positive look-behind/ahead)

我正在尝试编写正则表达式替换模式以替换 hash 中的数字,如下所示:

正则表达式链接

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但我确保在我的后视中排除捕获组,所以我真的不确定问题出在哪里。

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

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

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

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

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

模式匹配的地方

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM