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

在特定字符串旁边搜索两个字符之间的字符串

  •  1
  • DanCue  · 技术社区  · 7 年前

    我需要对我的函数进行一些修改,以允许在一个值的一行上搜索两个字符串。我想自己解决这个问题,但我需要一些帮助。下面是正在查看的单元格值的示例。假设没有前导或尾随新行。而且,所有单元格的格式都相同。行数相同,成员类型结构相同:姓氏、名字等。

    enter image description here

    假设我想看看这个单元格是否包含 team lead 以……的名义 last2 或A Manager 用这个名字 first4 . 员工类型和姓名都将由用户输入。

    我尝试使用在 this

    indexOf(':(.*):')
    

    它返回内容在冒号和包括冒号之间的位置。然后我尝试了以下方法:

    flatUniqArr[0].search('Supervisor:')
    

    这就是我被困的地方。它将索引返回到第一行的最后一位。

    我的想法是在冒号之间搜索用户输入的名称,如果他们遵循用户输入的成员类型。我怎样才能做到这一点?

    澄清: 最终目标是验证名称和成员类型是否在同一行,并且是否从我为其生成的数组中排除。 .setHiddenValues() . 所以如果它们在同一行,就从列表中排除。

    下面是我要添加到的函数:

    var flatUniqArr = colValueArr.map(function(e){return e[0].toString();})
    .filter(function(e,i,a){
      return (a.indexOf(e) == i && !(visibleValueArr.some(function(f){
        return e.search(new RegExp(f,'i')) + 1;
      })));
    });
    return flatUniqArr;
    

    在哪里? flatUniqArr 是隐藏值的列表。 colValueArr 列中的值数组。 visibleValueArr 是用户输入的名称,并且 memberType 将是成员类型。

    尝试使用Liora的解决方案:(更新…立即工作)

    var flatUniqArr = []
    var lines = []
    Logger.log(visibleValueArr)
    Logger.log(memberType)
    for (var i = 0; i < colValueArr.length; i++){
      lines = colValueArr[i].toString().split('\n');
      var found = false;
      for(var j = 0; j < lines.length; j++){
        var data = lines[j].toLowerCase().split(':')
        if(data[0] == memberType.toString().toLowerCase() && data[1].indexOf(visibleValueArr.toString().toLowerCase()) != -1){
          found = true;
        }
      }
      Logger.log(found)
      if(found == false){flatUniqArr.push(colValueArr[i])} 
    }
    
    return flatUniqArr;
    

    现在可以工作了。不过,这似乎有很多代码。如果其他解决方案更快和/或更少的代码行,我将乐于接受它们。

    更新:已添加 .toString().toLowerCase() 因为用户可以输入小写值。

    2 回复  |  直到 7 年前
        1
  •  1
  •   DanCue    7 年前

    我假设所有行都有这种格式。

    如果用分隔符拆分每一行:

    var array = value.split(":")
    

    那你就有了

    array[0] //the current role
    array[1] //the list of name
    array[2] //the email
    

    然后你可以检查每个名字

    if(array[0] == "Team Lead" && array[1].indexOf("last2") != -1)
    

    使用linesplit的示例:

    var lines = value.toString().split("\n");
    var found = false;
    for(var i = 0; i < lines.length ; i++){
        var data = value.split(":")
        if(data[0] == "Team Lead" && data[1].indexOf("last2") != -1){
             found = true;
        }
    }
    
        2
  •  1
  •   Aaron Leon    7 年前

    使用用户输入构建regex如何?

    function search(line, employeeType, employeeName) {
        var regexp = '/' + employeeType + ': ' + employeeName + '/'
        return line.search(regexp)
    }
    

    或者更好的是,如果它总是出现在字符串的开头,只需使用 startsWith()