2017-12-13 3 views
3

Ich versuche, einen Modus zu erstellen, der Todo.txt-Format ermöglicht, die sehr, sehr einfach ist, aber mit einem seltsamen Regex-Verhalten, wenn Codemirror Ergebnisse übereinstimmt.Weird Regex Verhalten mit Codemirror's einfachen Modus

Grundsätzlich versuche ich alle Zeilen zu markieren beginnt mit "x" nach einem Leerzeichen und diese Bedingung nur am Anfang einer Zeile, aber Regex nimmt eine Zeichenfolge in der Mitte der Zeile.

Meine regex diese Bedingung nicht entsprechen, wenn sie auf andere Javascript regex Tools versuchen: https://regex101.com/r/kUXTqf/1

Hier meine regex Linie von der einfachen Modus Definition lautet:

{regex: /^(x).*$/, token: "task-completed"} 

Und der Text, den ich bin Tests gegen:

x 2017-12-12 @geek add file location preference option +todotxtapp 
(A) @geek completed task syntax highlighter rule needs tweak - it includes any character follows with whitespace - starting in the middle of the line +todotxtapp 
(B) @geek design new app icon +todotxtapp 
(C) @geek add priority shortcut cmd+up/down or similar +todotxtapp 
asdasdasdasdasa x dsljhdsfkljg dhsklf sdaf 

In der Praxis muss nur die erste Zeile übereinstimmen. Aber es entspricht dem halben Teil der zweiten Zeile und der letzten Zeile. See Ergebnis hier: http://take.ms/S2PEL

+0

Seltsam, und ich konnte keine Dokumentation finden, die dieses Verhalten diskutiert. Wie deine Regex101-Demo zeigt, würde ich erwarten, dass dein Muster so funktioniert, wie du denkst. –

Antwort

3

Ich bin nicht vertraut mit Codemirror, aber aus der Dokumentation gehen,

Einfache Modi (lose auf der Grundlage der gemeinsamen JavaScript Syntax-Hervorhebungen Spezifikation, die auszog nie), sind Staat Maschinen, bei denen jeder Staat eine Anzahl von Regeln hat, die mit Tokens übereinstimmen.

Die regexp nicht auf Linien funktioniert, funktioniert es auf Token. So werden asdasdasdasdasa, x, dsljhdsfklhg alle einzeln getestet; und, nicht überraschend, x entspricht /^(x).*$/.

Es scheint, dass Sie so etwas wie dies wollen (man könnte es zwicken müssen, wie ich es nicht testen):

{regex: /x/, token: "task-completed", sol: true} 

sol: boolean

Wenn wahr, dieses Token wird nur am Anfang der Zeile übereinstimmen. (Die^regexp Marker funktioniert nicht, wie Sie in diesem Zusammenhang in JavaScript ist RegExp API aufgrund von Einschränkungen erwarten würde.)

EDIT: Ich muss sagen, ich bin nicht ganz sicher, was bei syntax passiert.

+0

Dank Amadan, bevor ich es ausprobiert habe, lese ich die Quelle des einfachen Modus und es überprüft einfach Sol in der Regeldefinition. Ihr Vorschlag arbeitete wie ein Zauber. –