SyntaxError: (irb):4: invalid pattern in look-behind (positive look-behind/ahead)
SyntaxError: (irb):4: invalid pattern in look-behind (positive look-behind/ahead)
我正在尝试编写一个正则表达式替换模式以替换散列中的数字,如下所示:
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+(?=.*)/
我正在四处寻找类似的问题,例如 ,但我确保在我的回顾中排除了捕获组,所以我真的不确定问题出在哪里。
原因是 Ruby 的 Onigmo 正则表达式引擎不支持无限宽度回顾模式。
在一般情况下,包含 *
、+
或 {x,}
等量词的 positive lookbehinds 通常可以替换为消费模式后跟 \K
:
/(?: |\t*[a-zA-Z0-9_]+: |\t+)\K\d+(?=.*)/
#^^^ ^^
然而,你甚至不需要那么复杂的图案。 (?=.*)
是多余的,因为它不需要任何东西,.*
甚至匹配一个空字符串。如果当前位置的左侧紧邻 space 或制表符,则将触发正后视模式。正则表达式等于
.gsub(/(?<=[ \t])\d+/, "321")
模式匹配的地方
(?<=[ \t])
- 紧接 space/tab 的位置
\d+
- 一位或多位数字。
我正在尝试编写一个正则表达式替换模式以替换散列中的数字,如下所示:
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+(?=.*)/
我正在四处寻找类似的问题,例如
原因是 Ruby 的 Onigmo 正则表达式引擎不支持无限宽度回顾模式。
在一般情况下,包含 *
、+
或 {x,}
等量词的 positive lookbehinds 通常可以替换为消费模式后跟 \K
:
/(?: |\t*[a-zA-Z0-9_]+: |\t+)\K\d+(?=.*)/
#^^^ ^^
然而,你甚至不需要那么复杂的图案。 (?=.*)
是多余的,因为它不需要任何东西,.*
甚至匹配一个空字符串。如果当前位置的左侧紧邻 space 或制表符,则将触发正后视模式。正则表达式等于
.gsub(/(?<=[ \t])\d+/, "321")
模式匹配的地方
(?<=[ \t])
- 紧接 space/tab 的位置
\d+
- 一位或多位数字。