Google表格脚本中的正则表达式

时间:2018-09-09 17:55:38

标签: javascript regex google-apps-script google-sheets regex101

我有2个正则表达式可以在regex101上完美运行,但是在工作表脚本中,一个( REGEX_RANGO )在调用.test时返回false,而另一个( REGEX_INVIDIDUAL >)根本不起作用。

(注意:我在工作表上使用一个单元格来调试这种情况,我不知道它是否更好,如果有人知道,请发布!)

我当前的正则表达式为:

var REGEX_RANGO = /((?=(\d|\,))(\d{1,3}-\d{1,3})+(?=(\s|\,)))/gm;
var REGEX_INDIVIDUAL = /((?<=,)|(?:^(\d)))[^(,|\-)\n]+((?=,)|(?:\s))/gm;

为什么我都需要?好吧,我有一个表单,人们可以将其连接起来,而正则表达式可以对它们起作用。

输入就像:

  • *000-005,100,200,250-275,300*
    • REGEX_RANGO 应该在数组上获得[000,005,250,275]值
    • 另一个数组上的
    • REGEX_INDIVIDUAL 应该获得[100,200,300]
  • *001,002,003,010-015*
    • REGEX_RANGO 应该在数组上获得值[010,015]
    • REGEX_INDIVIDUAL 应为[001,002,003]

希望有人知道如何处理,谢谢。你可以找到我目前的尝试 herehere

要清楚:这在regex101上有效,而不在Google Sheet上有效,也许是作用域还是我需要对正则表达式进行转义?

已编辑:

var REGEX_INDIVIDUAL = /((?<=,)|(?:^(\d)))[^(,|\-)]+(?=($|,))/gm;
var j = numeros_ingresados.match( REGEX_INDIVIDUAL )
SpreadsheetApp.getActiveSheet( ).getRange("F1").setValue( " >> j : " + j )

1 个答案:

答案 0 :(得分:1)

请注意,您的模式中的GAS JS RegExp不支持类似(?<=,)的后退。

您可以使用以下示例代码提取所需的值:

function extractRangos() {
  var s = "000-005,100,200,250-275,300";
  var REGEX_RANGO = /(?:^|,)(\d+)-(\d+)(?![^,])/g;
  var REGEX_INDIVIDUAL = /(?:^|,)(\d+)(?![^,])/g;
  var m, res_rango = [], res_ind = [];
  while (m = REGEX_RANGO.exec(s)) {
    res_rango.push(m[1]);
    res_rango.push(m[2]);
  }
  while (m = REGEX_INDIVIDUAL.exec(s)) {
    res_ind.push(m[1]);
  }
  Logger.log(res_rango);
  Logger.log(res_ind);
}

结果日志:

enter image description here

正则表达式详细信息

单个正则表达式模式为

(?:^|,)(\d+)(?![^,])

它匹配

  • (?:^|,)-字符串或逗号开头
  • (\d+)-捕获第1组:一个或多个数字
  • (?![^,])-如果下一个字符不是逗号(数字后的下一个字符应为逗号或字符串末尾),则负匹配将使匹配失败。

重点是仅收集第1组的值。

请参见its online demo

rango regex模式是

(?:^|,)(\d+)-(\d+)(?![^,])

请参见this online demo

它匹配:

  • (?:^|,)-与字符串开头或逗号匹配的非捕获组
  • (\d+)-第1组:一个或多个数字
  • --连字符
  • (\d+)-第2组:一个或多个数字
  • (?![^,])-如果下一个字符不是逗号,则否定超前匹配将失败。

重点是仅收集组1和2的值。