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

Regex根据位置替换字符串的部分

  •  0
  • daGUY  · 技术社区  · 11 年前

    给定以下字符串:

    matrix(1.5, 0, 0, 2, 160, 160)
    

    我想替换第一个和第四个值,不管它们是什么 1 ,所以我会:

    matrix(1, 0, 0, 1, 160, 160)
    

    如果第一个和第四个值恰好相同,我可以像这样轻松地替换它们:

    .replace(/1\.5/g, "1")
    

    但这只是在数字上匹配,而不是在位置上匹配,所以如果第一个和第四个值不相同,就不起作用。我想替换 任何 这两个位置的值 1. .

    4 回复  |  直到 11 年前
        1
  •  1
  •   Jerry    11 年前

    您可以使用正则表达式:

    .replace(/[\d.]+(?=(?:, [\d.]+){5}|(?:, [\d.]+){2}\))/g, "1")
    

    regex101 demo

    只有在前面还有5或2个数字的情况下,它才会基本上匹配一个数字(如果有句点的话),直到最后一个paren。

        2
  •  1
  •   alpha bravo    11 年前

    这种模式 [\d.]+((,[\s*\d.]+){2},\s*)[\d.]+ 将替换第一个和第四个参数,而不考虑剩余参数的数量。 替换为 1$11 Demo

        3
  •  0
  •   Andrew Clark    11 年前

    以下是一个不需要了解当前参数类型的解决方案:

    .replace(/\(([^,]*),\s*([^,]*),\s*([^,]*),\s*([^,]*),\s*(.*?)\)/, "(1, $2, $3, 1, $5)");
    

    这是通过从开始的paren到结束的paren进行匹配,并在一个单独的捕获组中捕获每个参数来实现的(除了所有剩余的参数都在组5中捕获)。这比其他一些替代方案稍长,但它是一个可读性很强的替代方案。

        4
  •  0
  •   user557597 user557597    11 年前

    从左到右阅读,您总是可以分割出要替换的线段。不管是1还是99:

     #  (\(\s*)[^,]*((?:,[^,]*){2},\s*)[^,]*
     #  Replacement =  $1 + '1' + $2 + '1' 
    
     ( \( \s* )              # (1), Preamble
     [^,]*                   # 1st value
     (                       # (2), middle 
    
          (?: , [^,]* ){2}
          , \s* 
     )
     [^,]*                   # 4th value