2016-12-20 6 views
0

https://jsfiddle.net/sbzxd5ya/1/ - Hier ist ein Javascript, das funktioniert, wo ich versuche, einige Werte aus einer Spalte in einem Array mit regulären Ausdruck zu extrahieren.nicht übereinstimmende Gruppen in Google App-Skript

Aber wenn ich versuche, Google-App-Skript i bekommen - Syntaxerror: Unübertroffene) in regulärem Ausdruck für 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; 
} 

Kann jemand helfen, das Problem zu beheben und das erwartete Ergebnis.

Antwort

0

Nicht einfangenden Gruppen sind broken in Google Apps Script mit dem Status "WONTFIX":

The engineering team decided not to take action on this issue.

So benutzen sie nicht. Sie spielen sowieso keine Rolle in deinen Regexes.

Ein weiteres Problem, das entweder eine defekte Regex-Engine oder eine falsche Schleifenoptimierung anzeigt, ist, dass die lastIndex-Eigenschaft der Regex indices nicht auf Null zurückgesetzt wird, wenn Sie Indizes mit var indices = ... zuweisen. (Ich vermute, das liegt daran, dass diese Zuordnung „optimiert“ erhalten aus der Schleife.) Also, setzen Sie es manuell:

var indices = /\(P(\d)/g; 
    indices.lastIndex = 0; 
    var splitter = /(\d)\)/g; 

Dann wird das Skript korrekt funktioniert.


Testbeispiel für die last Ausgabe:

for (var i = 0; i < 3; i++) { 
    var re = /a/g; 
    Logger.log(re.lastIndex); 
    re.exec('aaa'); 
    } 

Ausgänge 0, 1, 2 in Google Apps Script. In einem Browser wäre die Ausgabe 0, 0, 0.


Letzte Bemerkung, in Bezug auf ein Syntaxproblem. Aus irgendeinem Grund haben Sie sich dafür entschieden, reguläre Ausdrücke aus Zeichenfolgen zu erstellen, indem Sie anstatt der in der Fidel verwendeten Regex-Literale verwenden. Um dies richtig zu tun, müssen Sie dem Escaping doppelt Aufmerksamkeit schenken: Es gibt ein Entweichen auf der Regex-Ebene, und dann gibt es auf der String-Ebene ein Entweichen. Lange Rede kurzer Sinn,

var splitter = new RegExp('/(\d)(?:\))','g'); 

sollte

var splitter = new RegExp('/(\\d)(?:\\))','g'); 

sein, weil jeder Backslash, die Sie in der Regex angezeigt werden soll muss eine doppelte Backslash in der Zeichenfolge sein. Es wäre einfacher, eine Regex wörtlichen zu verwenden: Sie müssen nicht umgekehrte Schrägstriche in ihr zu entkommen, obwohl vorwärts jetzt Schrägstriche entwertet werden muß:

var splitter = /\/(\d)(?:\))/g 
+0

Auch nach Festsetzung es .. Ich habe nicht die erwartete Ausgabe erhalten. –

+0

Ihre "Indizes" Regex hat ein ähnliches Problem. – FTP

+0

var indexes = new RegExp ('/ \ (?: \\ (P) (\\ d) /', 'g'); var splitter = neuer RegExp ('/ (\\ d) (?: \\))','G'); –

Verwandte Themen