Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google应用程序脚本(JavaScript)正则表达式拆分电子表格单元格引用_Javascript_Regex_Google Apps Script - Fatal编程技术网

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

Google应用程序脚本(JavaScript)正则表达式拆分电子表格单元格引用,javascript,regex,google-apps-script,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 < cell

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

我目前使用的公式是:

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]));
  }
}
但是,目前我的输出是:

[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
坦率地说,我有点像一个Regex新手,但我不明白为什么这不能像预期的那样工作


欢迎所有积分,非常感谢。

您需要删除
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]]);
    }
  }
}
或者,您也可以通过添加锚来告诉正则表达式引擎匹配整个字符串:

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

为什么需要删除全局修饰符:添加
g
时,regex
.lastIndex
属性将前进到匹配结束的位置,因此,将从模式可以匹配的文本之前的位置查找下一个匹配项。

因此,对我的代码进行了一次小的调整,使其正常工作

在正则表达式中引入管道运算符,并用
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));
  }
}
函数重新测试(){
变量re=/(\$?[A-Za-z]+)|(\$?[0-9]+)/g;
变量单元格=['A1'、'AA1'、'A12'、'A$1'、'AA$1'、'A$12'、'A1'、'AA1'、'A12'、'A$1'、'AA$1'、'A$12'];
对于(变量i=0;i
太棒了!我还找到了一个解决方案,正如你在上面发布的一样,有什么理由选择一种方法而不是另一种方法吗?
/(\$?[a-Za-z]+)|(\$?[0-9]+)/g
将匹配字符串中任意位置出现的多个
(\$?[a-Za-z]+)
(\$?[0-9]+)
模式。如果字符串中有两个组,我建议
/^(\$?[A-Za-z]+)(\$?[0-9]+)$/
。在
$12()abc$A中找不到匹配项
var re = /^(\$?[A-Za-z]+)(\$?[0-9]+)$/;
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));
  }
}