【问题标题】:Google Sheets multiple search and replace from a list with repeated stringsGoogle表格多次搜索并从具有重复字符串的列表中替换
【发布时间】:2019-12-04 04:30:54
【问题描述】:

我已经在 Google Sheets multiple search and replace from a list 类似问题。

我正在使用脚本

function preg_quote( str ) {
  // http://kevin.vanzonneveld.net
  // +   original by: booeyOH
  // +   improved by: Ates Goral (http://magnetiq.com)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   bugfixed by: Onno Marsman
  // *     example 1: preg_quote("$40");
  // *     returns 1: '\$40'
  // *     example 2: preg_quote("*RRRING* Hello?");
  // *     returns 2: '\*RRRING\* Hello\?'
  // *     example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
  // *     returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'

  return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
}

function ARRAYREPLACE(input,fromList,toList,caseSensitive){
  /* default behavior it is not case sensitive */
  if( caseSensitive == undefined ){
    caseSensitive = false;
  }
  /* if the from list it is not a list, become a list */
  if( typeof fromList != "object" ) {
    fromList = [ fromList ];
  }
  /* if the to list it is not a list, become a list */
  if( typeof toList != "object" ) {
    toList = [ toList ];
  }
  /* force the input be a string */
  var result = input.toString();

  /* iterates using the max size */
  var bigger  = Math.max( fromList.length, toList.length) ;

  /* defines the words separators */
  var arrWordSeparator = [ ".", ",", ";", " " ];

  /* interate into the lists */
  for(var i = 0; i < bigger; i++ ) {
    /* get the word that should be replaced */
    var fromValue = fromList[ ( i % ( fromList.length ) ) ]
    /* get the new word that should replace */
    var toValue = toList[ ( i % ( toList.length ) ) ]

    /* do not replace undefined */
    if ( fromValue == undefined ) {
      continue;
    }
    if ( toValue == undefined ) {
      toValue = "";
    }

    /* apply case sensitive rule */
    var caseRule = "g";
    if( !caseSensitive ) {
      /* make the regex case insensitive */
      caseRule = "gi";
    }

    /* for each end word char, make the replacement and update the result */
    for ( var j = 0; j < arrWordSeparator.length; j++ ) {

      /* from value being the first word of the string */
      result =  result.replace( new RegExp( "^(" + preg_quote( fromValue + arrWordSeparator[ j ] ) + ")" , caseRule ), toValue + arrWordSeparator[ j ] );

      /* from value being the last word of the string */
      result =  result.replace( new RegExp( "(" + preg_quote( arrWordSeparator[ j ] + fromValue ) + ")$" , caseRule ), arrWordSeparator[ j ] + toValue );

      /* from value in the middle of the string between two word separators */
      for ( var k = 0; k < arrWordSeparator.length; k++ ) {
        result =  result.replace( 
          new RegExp( 
            "(" + preg_quote( arrWordSeparator[ j ] + fromValue + arrWordSeparator[ k ] ) + ")" , 
            caseRule 
          ), 
          /* need to keep the same word separators */
          arrWordSeparator[ j ] + toValue + arrWordSeparator[ k ] 
        );
      }
    }

    /* from value it is the only thing in the string */
    result =  result.replace( new RegExp( "^(" + preg_quote( fromValue ) + ")$" , caseRule ), toValue );
  }
  /* return the new result */
  return result;
}

一个示例输入是;

"

详情

  • 挂脖款式
  • 无袖
  • 可拆卸 腰系带
  • 聚拢分层裙板
  • 隐形 后拉链
  • 后颈开口,按钮关闭
  • 无衬里

尺码

  • 模特身高 170 厘米,穿 8 码
  • 平底裤 测量:
    • 尺寸 8 长度 - 139cm,腰围 - 33cm, 胸围 - 43cm
    • 尺码 10 身长 - 141cm,腰围 - 35cm,胸围 - 45cm
    • 尺码12 身长 - 143cm 腰围 - 37cm 胸围 - 47cm
    • 尺码14 身长-145cm 腰围-38cm 胸围-48cm
  • 模特数据:胸围 - 76cm,腰围 - 57cm,臀围 - 91cm

服装护理

  • 材料 - 人造丝
  • 冷手分开洗
"

替换列表位于; https://docs.google.com/spreadsheets/d/1MxaZ1Jki1fnVw6jfFllur2BpPN6-6b6fAmLSKQniG-8/edit#gid=0

但是我的结果只显示了一些字符串的转换。下面是输出;

"

详情

  • 挂脖款式
  • 无袖
  • 可拆卸 腰系带
  • 聚拢分层裙板
  • 隐形 后拉链
  • 后颈开口,按钮关闭
  • 无衬里

尺码

  • 模特身高 5 英尺 6 英寸,穿 8 码
  • 平底裤 测量:
    • 尺寸 8 长度 - 54.5"",腰围 - 13"", 胸围 - 43 厘米
    • 尺寸 10 长度 - 55.5"",腰围 - 14"",胸围 - 45cm
    • 尺码 12 身长 - 56.5"",腰围 - 14.5"",胸围 - 47cm
    • 尺码 14 身长 - 57"",腰围 - 15"",胸围 - 48cm
  • 模特数据:胸围 - 30 英寸,腰围 - 22.5 英寸,臀围 - 91 厘米

服装护理

  • 材料-人造丝
  • 单独冷手洗
"

每行尺寸的第三个实例被忽略,尺寸完全被忽略。谁能告诉我脚本是否仅限于一定数量的替换,或者我应该进行任何更改以替换大小?提前致谢。

【问题讨论】:

    标签: regex string google-apps-script google-sheets replace


    【解决方案1】:

    测试代码后,问题似乎出在行尾的值上。如果您将输入定义为多行 JavaScript 字符串,请确保在这些值之后留一个空格。

    var input = "\
    DETAILS\
    \
    halter neck style\
    sleeveless\
    detachable waist tie\
    gathered tiered skirt panels\
    invisible back zip\
    back neck opening with button close\
    unlined\
    SIZING\
    \
    model is 170cm and wears a size 8\
    garment flat measurements:\
    size 8 length - 139cm, waist - 33cm, bust - 43cm \ //Notice the space after "cm"
    size 10 length - 141cm, waist - 35cm, bust - 45cm \
    size 12 length - 143cm, waist - 37cm, bust - 47cm \
    size 14 length - 145cm, waist - 38cm, bust - 48cm \
    model stats: bust - 76cm, waist - 57cm, hips - 91cm \
    GARMENT CARE\
    \
    material - rayon\
    cold hand wash separately\
    ";
    

    如果您通过文件读取此输入,则问题可能与新行 (\n) 或回车 (\r) 有关,我会将这些值添加到 arrWordSeparator 变量中以获取照顾多线输入。所以它看起来类似于这样:

     /* defines the words separators */
      var arrWordSeparator = [ ".", ",", ";", " ", "\n", "\r" ];
    

    【讨论】:

    • 谢谢,这是正确的方法。因为它是 html,所以在行的开头和结尾有一个无序列表元素。添加这些变量作为arrWordSeparator 定义解决了这个问题。感谢您的帮助。
    猜你喜欢
    • 2015-06-07
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多