2016-04-15 14 views
0

Ich mache eine Syntaxdefinition für eine benutzerdefinierte Sprache in sublime Text 2 mit PackageDevelopment .YAML-tmLanguage. Fürs Erste möchte ich, dass meine Syntax Strings zu nicht Strings identifiziert.Wie Operator-getrennte Zeichenfolgen in Sublime Package Development übereinstimmen YAML tmlanguage

Probe Codezeile:

string name = "Chuck Norris"; 
string message = "I am " + name + ", don't mess with a \"ROCKSTAR\"!"; 

mein Muster für doppelte Anführungszeichen:

- comment: strings in double quotes 
    match: (".+") 
    captures: 
    '1': {name: string.quoted.double.me} 

was das Muster erfasst:

string name = "Chuck Norris";
Zeichenfolge Nachricht = "I am " + name + ", don't mess with a "ROCKSTAR"!";

Zeile 1 oben ist korrekt, aber Zeile 2 scheint alle zu erfassen.

, was ich will, ist:

string name = "Chuck Norris";
Zeichenfolge Nachricht = "I am " + Name + ", don't mess with a "ROCKSTAR"!";

+0

machen es faul mit '. +?' ..check: - https://regex101.com/r/pC5wN5/1 – rock321987

+0

@ Rock321987, schon versucht, dass die Lösung .. aber es funktioniert nicht – catzilla

+0

'[^"] + 'sollte auch funktionieren (Wenn innerhalb der Zeichenfolge kein verschachteltes "" vorhanden ist) – rock321987

Antwort

1

Ich entdeckte eine gute Implementierung, wie Operator-getrennte Strings übereinstimmen und auch doppelt zitierte Strings und einige zusätzliche Funktionalitäten mit YAML übereinstimmen.

@Wiktor Stribiżewv Antwort erfüllt auch die Frage, aber ich fand eine gute Implementierung für diese:

- comment: strings in double quotes 
    name: string.quoted.double.hit 
    begin: \" 
    end: \" 
    patterns: 
    - comment: escape characters 
    name: constant.character.escape.hit 
    match: \\. 

    - comment: special characters 
    name: constant.character.hit 
    match: \%. 

dies entspricht auch Zeichen wie \", \n und Sonderzeichen entkommen %s, %d

1

Sie müssen alle Zeichen, die nicht " und auch Kombinationen von \ + alles zwischen den Anführungszeichen übereinstimmen.

Verwenden

"[^"\\]*(?:\\.[^"\\]*)*" 

Siehe this regex demo

Es ist auch als "(?:[^"\\]|\\.)*" geschrieben werden können. Es ist einfacher zu lesen, aber weniger effizient.

+0

Ich fand diese Antwort richtig und nützlich, aber ich fand auch eine bessere Implementierung mit YAML tmlanguage specifiers. – catzilla

+1

Dann yo Du kannst posten. Tatsächlich können Sie innerhalb von Beginn/Ende verschachtelte Regeln verwenden, sodass Sie die Anführungszeichen als Anfangs- und Endmuster deklarieren und dann eine Nesnested-Regel für eine Escape-Entität verwenden können. –

+0

ja, das ist wahr .. was du gesagt hast, ist genau das, was ich getan habe. Ich habe 'begin' und' end' verwendet. und auch verwendet nesting .. :) – catzilla