https://jsfiddle.net/sbzxd5ya/1/ - 这是一个javascript,它可以在我尝试使用正则表达式从数组中的列中提取某些值时起作用。
但是,当我尝试相同的谷歌应用程序脚本时,我得到 - SyntaxError:Unmatched)正则表达式中的var - splitter
function getSpreadsheetData61() {
var data6 = [
["id", "name", "count", "Category"],
["1", "g", "8", "[(P2, 7), (P1, 1)]"],
["2", "g", "8", "[(P0, 7), (P2, 1)]"],
["2", "g", "8", "[(P0, 7), (P2, 1),(P1,5)]"],
["3", "g", "8", "[()]"],
["4", "t", "4", "[(P2, 4)]"]
];
var output=[];
for (var i = 1; i < 2; i++) {
var row = data6[i];
data6.map(function(row) {
var toExpand = row[row.length - 1];
var indices = new RegExp('/\(?:\\(P)(\d)/','g');
var splitter = new RegExp('/(\d)(?:\))','g');
var extracted;
var eIndex;
Logger.log(splitter);
toAdd = [0, 0, 0];
while (extracted = splitter.exec(toExpand)) {
eIndex = indices.exec(toExpand);
toAdd[eIndex[1]] = extracted[1];
}
//Logger.log(eIndex);
output.push(row.concat(toAdd));
});
}
Logger.log(output);
return data6;
}
有人可以帮助解决问题并获得预期结果。
答案 0 :(得分:0)
非捕获组为broken in Google Apps Script,状态为“WontFix”:
工程团队决定不对此问题采取行动。
所以,不要使用它们。无论如何,他们在你的正则表演中没有任何作用。
指示正则表达式引擎损坏或循环优化不正确的另一个问题是,当您使用indices
分配索引时,正则表达式var indices = ...
的lastIndex属性不会重置为零。 (我怀疑这是因为这个赋值在循环中被“优化”了。)所以,手动重置它:
var indices = /\(P(\d)/g;
indices.lastIndex = 0;
var splitter = /(\d)\)/g;
然后脚本正常工作。
lastIndex问题的测试示例:
for (var i = 0; i < 3; i++) {
var re = /a/g;
Logger.log(re.lastIndex);
re.exec('aaa');
}
在Google Apps脚本中输出0,1,2。在浏览器中,输出将为0,0,0。
最后一点,关于语法问题。出于某种原因,您决定使用new RegExp(string)
而不是小提琴中使用的正则表达式文字来构建来自字符串的正则表达式。要正确地执行此操作,您需要双倍关注转义:在正则表达式级别上有转义,然后在字符串级别上转义。长话短说,
var splitter = new RegExp('/(\d)(?:\))','g');
应该是
var splitter = new RegExp('/(\\d)(?:\\))','g');
因为要在正则表达式中出现的每个反斜杠都必须是字符串中的双反斜杠。使用正则表达式文字会更容易:你不需要在其中转义反斜杠,虽然现在必须转义正斜杠:
var splitter = /\/(\d)(?:\))/g