我目前正在寻找一个将字符串电子表格单元格引用拆分为列/行(字母/数字)组件的函数。
我目前正在使用的公式是:
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
我会坦率地说我是一个正则表达式新手,但我不明白为什么这不能按预期工作。
欢迎所有观点,非常感谢。
答案 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));
}
}