javascript - 用于连续/嵌套正则表达式的 Google Sheets 脚本

标签 javascript regex google-sheets

我正在尝试在 Google 表格上重现嵌套的 Regex_MATCH 函数,但使用匹配表(以便我可以更轻松地调整/编辑)。它应该与数组一起使用,因为我将把它与 arrayformula 一起使用。

Test sheet link

例如:我想替换这样的公式:

=arrayformula(if(len(A2:A)>1,If(REGEXMATCH(A2:A, "[bB]lue[bB]alloon|Blue_Balloon"),"BlueBalloon_2017",
IF(REGEXMATCH(A2:A, "[hH]ydraphase"),"Hydraphase_2017",
IF(REGEXMATCH(A2:A, "[sS]kinchecker"),"Skinchecker_2017"))),""))

用一个简单的:

=arrayformula(if(len(A2:A)>1,regexTable(A2:A),"")

其中 regexTable 是自定义函数

// function loop RE_table named range and get matching value in result_table
function regexTable()
{
  var s = SpreadsheetApp.getActiveSpreadsheet();
  var refs = s.getSheetByName('refs') //get range in refs worksheet
  var RE_table = refs.getRange("D2:D4").getvalues; // list of regular expressions to test
  var result_table = refs.getRange("E2:E4").getvalues; // results to return if REGEX_MATCH = TRUE

  var numRows = RE_table.getNumRows(); // loop through all regular expressions to test
  for (var i = 1; i <= numRows; i++) { // I would like to exist loop as soon as REGEX_MATCH = TRUE
  if(RE_table[i][1].test())
    return result_table[i][1]         
  }
}

这是我第一次使用 Google 脚本编辑器,所以我的问题是:

  1. 什么不起作用?
  2. 如何才能尽可能快地运行?

非常感谢, 来自瑞士的欢呼。

最佳答案

用法

作为工作表中的自定义函数:

=getRegexTable(matchArray, 正则表达式, 替换)

函数

粘贴到脚本编辑器中:

/**
  * returnType  -  "row" or "column" (default)
*/
function getRegexTable(matchArray, regexs, replaces, returnType) {
  // convert attays to lines
  matchArray = convertArrayIntoLine(matchArray);
  matchArray = convertArrayIntoLine(matchArray);
  matchArray = convertArrayIntoLine(matchArray);

  returnType = returnType || "column" // set dafault to rows  
  var machValue = '';
  var result = [];
  // for each machValue
  for (var i = 0, ii = matchArray.length; i < ii; i++)
  {
    machValue = matchArray[i]; 
    result.push(getRegexList(machValue, regexs, replaces));    
  }  
  if (returnType == "column") return convertLineIntoColumn(result);  
  return result;
}

function getRegexList(machValue, regexs, replaces, defaultResult)
{
  var defaultResult = defaultResult || '';
  var regex;
  // for each regex
  for (var i = 0, ii = regexs.length; i < ii; i++)
  {
    if(machValue.match(new RegExp(regexs[i]))) return replaces[i];    
  }  
  return defaultResult;
}

function convertArrayIntoLine(array)
{
  if (!Array.isArray(array[0])) return array;
  var row = [];
  var result = [];
  for (i = 0, ii = array.length; i < ii; i++)
  {
    row = array[i];
    for (var j = 0, jj = row.length; j < jj; j++)
    {
      result.push(row[j]);
    }  
  }
  return result;
}

function convertLineIntoColumn(array)
{
  var result = [];
  for (var i = 0, ii = array.length; i < ii; i++)
  {
    result.push([array[i]]);  
  }
  return result
}

测试

我用这段代码测试了它:

function test_getRegexTable()
    {
      var matchArray = [
        'Hydraphase boo',
        'bar Skinchecker',
        'BlueBalloon foo', 
        'BlueBalloon foo', 
        'bar Skinchecker', 
        'boo'];

      var regexs = [
        '[bB]lue[bB]alloon|Blue_Balloon',
        '[hH]ydraphase',
        '[sS]kinchecker'];

        var replaces = [
          'BlueBalloon_2017',
          'Hydraphase_2017',
          'Skinchecker_2017']

      Logger.log(getRegexTable(matchArray, regexs, replaces));
      /* result:
      [
        [Hydraphase_2017], 
        [Skinchecker_2017], 
        [BlueBalloon_2017], 
        [BlueBalloon_2017], 
        [Skinchecker_2017], 
        []]
      */
    }


    function test_convertArrayIntoLine()
    {
      var array = [1, 2, 3];
      Logger.log(convertArrayIntoLine(array));
      array = [[1,2], [3,4]];
      Logger.log(convertArrayIntoLine(array)); 
    }

    function test_convertLineIntoColumn()
    {
      var array = [1, 2, 3];
      Logger.log(convertLineIntoColumn(array));
    }

关于javascript - 用于连续/嵌套正则表达式的 Google Sheets 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45941590/

相关文章:

javascript - 从 JSON 中获取 Javascript 中不同键的多个集合

javascript - toIsoString : does not convert well the date object 的偏移时区问题

php - 在 PHP 中删除 BBCode 标签及其内容

javascript - 在ajax中发送多个值

javascript - HTML5音频-Android上的currentTime值始终为0

ruby - 如何在 Ruby 中使用正则表达式将字符串拆分为它包含的单词数组?

regex - 在 Perl 中使用预编译正则表达式时的问题

javascript - 当 Google Script 检测到后台发生变化(例如 cron)时,它如何发送电子邮件?

google-sheets - 计算一段时间内有多少个特定天

google-sheets - 是否可以在 Google Sheets 函数中使用数组