代码之家  ›  专栏  ›  技术社区  ›  notacorn

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

  •  1
  • notacorn  · 技术社区  · 5 年前

    regexr link

    some_dict = {
      TEST: 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

    1 回复  |  直到 5 年前
        1
  •  1
  •   Wiktor Stribiżew    5 年前

    原因是Ruby的Onigmo regex引擎不支持无限宽度的lookback模式。

    一般来说, 正面表情落后 包含以下量词 * , + {x,} \K :

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

    但是,您甚至不需要这种复杂的模式。 (?=.*) 是多余的,因为它不需要任何东西, .*

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

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