regex - 语法错误: (irb):4: invalid pattern in look-behind (positive look-behind/ahead)

标签 regex ruby regex-lookarounds gsub regexp-replace

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

regexr link

some_dict = {
  TEST: 123
}

这样 123 就可以被捕获并替换。

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

你会发现这在 regexr 中工作得非常好: enter image description here

但是,当我在 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+ - 一位或多位数字。

关于regex - 语法错误: (irb):4: invalid pattern in look-behind (positive look-behind/ahead),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67644969/

相关文章:

java - 包含 * 的电话号码的正则表达式

regex - 获取 ":"之后的数字并借助powershell进行计数

javascript - 是否可以重复使用正则表达式中定义的逻辑两次

ruby-on-rails - Rails - 使用 Heroku SSL 在 Heroku 上发布

java - 如何在管道分隔文件中找到未被管道包围的字符串?

javascript - 使用正则表达式查找单词之间的特定文本

以 tr ("and ending with "开头的字符串的 Python 正则表达式)

ruby-on-rails - Rails 中的 Where 子句和模型函数

ruby-on-rails - 从 Rails 3.2.0 更新到 3.2.8 导致未初始化常量 Addressable

c# - RegEx 之后用特定文本捕获执行时间