Google Apps脚本(JavaScript)正则表达式拆分电子表格单元格引用

时间:2017-08-04 16:18:15

标签: javascript regex google-apps-script

我目前正在寻找一个将字符串电子表格单元格引用拆分为列/行(字母/数字)组件的函数。

我目前正在使用的公式是:

function reTest() {
  var re = /(\$?[A-Za-z]+)(\$?[0-9]+)/g;
  var cells = ['A1', 'AA1', 'A12', 'A$1', 'AA$1', 'A$12', '$A1', '$AA1', '$A12', '$A$1', '$AA$1', '$A$12'];
  for (var i = 0; i < cells.length; i++) {
    Logger.log(re.exec(cells[i]));
  }
}

我想要的输出(尽管是截断的)将是:

['A', '1']
['AA', '1']
['A', '12']
['A', '$1']
etc...

但是,目前我的输出是:

[A1, A, 1]
null
[A12, A, 12]
null
[AA$1, AA, $1]
null
[$A1, $A, 1]
null
[$A12, $A, 12]
null
[$AA$1, $AA, $1]
null

我会坦率地说我是一个正则表达式新手,但我不明白为什么这不能按预期工作。

欢迎所有观点,非常感谢。

2 个答案:

答案 0 :(得分:2)

您需要删除g全局修饰符,并且只抓取第1组和第2组捕获的文本:

此代码:

function reTest() {
  var re = /(\$?[A-Za-z]+)(\$?[0-9]+)/;
  var cells = ['A1', 'AA1', 'A12', 'A$1', 'AA$1', 'A$12', '$A1', '$AA1', '$A12', '$A$1', '$AA$1', '$A$12'];
  for (var i = 0; i < cells.length; i++) {
    var m = re.exec(cells[i]);
    if (m) {
      Logger.log([m[1], m[2]]);
    }
  }
}

产地:

[17-08-04 18:27:18:994 CEST] [A, 1]
[17-08-04 18:27:18:995 CEST] [AA, 1]
[17-08-04 18:27:18:995 CEST] [A, 12]
[17-08-04 18:27:18:996 CEST] [A, $1]
[17-08-04 18:27:18:996 CEST] [AA, $1]
[17-08-04 18:27:18:997 CEST] [A, $12]
[17-08-04 18:27:18:998 CEST] [$A, 1]
[17-08-04 18:27:18:998 CEST] [$AA, 1]
[17-08-04 18:27:18:999 CEST] [$A, 12]
[17-08-04 18:27:18:999 CEST] [$A, $1]
[17-08-04 18:27:19:000 CEST] [$AA, $1]
[17-08-04 18:27:19:000 CEST] [$A, $12]

或者,您也可以通过添加锚来告诉正则表达式引擎匹配整个字符串:

var re = /^(\$?[A-Za-z]+)(\$?[0-9]+)$/;

为什么需要删除全局修饰符:当您添加g时,正则表达式.lastIndex属性会前进到匹配结束的位置,因此将从下一个匹配项中查找可能已经超出模式可以匹配的文本的位置。

答案 1 :(得分:1)

所以事实证明,对我的代码进行了一些微调,让它运行起来。

在正则表达式中引入了一个管道运算符,并将RegExp.exec替换为string.match

function reTest() {
  var re = /(\$?[A-Za-z]+)|(\$?[0-9]+)/g;
  var cells = ['A1', 'AA1', 'A12', 'A$1', 'AA$1', 'A$12', '$A1', '$AA1', '$A12', '$A$1', '$AA$1', '$A$12'];
  for (var i = 0; i < cells.length; i++) {
    Logger.log(cells[i].match(re));
  }
}