• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[GELOEST] Regex - lookbehind ersetzen für Browserkompatibilität

chromo23

Neues Mitglied
Hallo,

ich benutze diese Regex für die Suche einzelner Wörter mit Ausgrenzung von Kommentaren welche durch // markiert sind.
Code:
/(?<!.*\/{2}.*)[\w?#.,]+/g
https://regex101.com/r/dMQjGo/1

Funktioniert super doch leider macht mir da Apple mit Safari einen Strich durch die Rechnung. Lookbehind wird nicht unterstützt.
Nun will ich aber, dass das überall funktioniert. Dafür brauche ich aber, da ich mit Regex überhaupt nicht wirklich zurecht komme, hilfe. (den Ausdruck oben habe ich mir auch nur mit Mühe und Not zusammen geschustert..:smile: )

Meine Überlegung ging in diese Richtung doch leider funtioniert das nicht wie gewünscht:
Code:
/(?=.*\/{2}.*)[\w?#.,]+|^(?:(?!\/{2}))[\w?#.,]+/gm
https://regex101.com/r/4zbpL5/1

Ist das überhaupt zu realisieren?
Kann mir da jemand behilflich sein?

Diese Frage habe ich, leider bis jetzt unbeantwortet, vor einer Woche auch hier gestellt: https://stackoverflow.com/questions...because-lookbehind-is-not-supported-in-safari

Danke im Voraus!
 
Zuletzt bearbeitet:

Sempervivum

Senior HTML'ler
da ich mit Regex überhaupt nicht wirklich zurecht komme
Wenn das so ist, würde ich daran denken, darauf zu verzichten, das auf Biegen und Brechen mit einer einzigen Regex zu erledigen (die dann möglicher Weise so komplex wird, dass kaum jemand mehr durchsteigt) sondern auf zwei Schritte aufzuteilen: Zunächst den Kommentar am Ende entfernen, dann dürfte es kein Problem mehr sein, die einzelnen Wörter aus dem Zwischenergebnis heraus zu ziehen.
 

chromo23

Neues Mitglied
Damit hast du auf jeden Fall recht. Nur zwingt mich deine Aussage dazu, noch mehr von meiner Unwissenheit preis zu geben. Das ist mir ein bisschen peinlich :oops:

Ich habe für ein im Browser codehighlighting codemirror eingebunden und dort gibt es eine Zusatzplugin welches die bereits geschriebenen Worte in eine Liste für Wortvorschläge aufnimmt... ich konnte das Plugin schon dahingehend modifizieren, dass es meine vorhandene Wortliste (extraWords) vergleicht damit es nicht zu Dopplungen kommt und danach wird alles nochmal sortiert.
Es sollte nun noch dazu kommen, dass Kommentare nicht in die Vorschlagsliste aufgenommen werden.
Nur leider reichen meine Kenntnisse nicht um das Plugin soweit zu bearbeiten, dass ich das Regex umgehen kann.

Hier meine Testseite: https://raw.githack.com/chromoxdor/EasyColorCode/main/colorcode.html
Hier der Code des betreffenden Plugins:

Javascript:
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function (mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function (CodeMirror) {
  "use strict";
  
// in der folgende Zeile hatte ich das Regex erweitert das Original sah so aus: var WORD = /[\w$]+/, RANGE = 500;
  var WORD = /(?<!.*\/{2}.*)[\w?#.,]+/, RANGE = 500; //works not on safari (macos/ios) because of regex lookbehind
  CodeMirror.registerHelper("hint", "anyword", function (editor, options) {
    var word = options && options.word || WORD;
    var range = options && options.range || RANGE;
    var extraWords = options && options.extraWords || EXTRAWORDS;
    var cur = editor.getCursor(), curLine = editor.getLine(cur.line);
    var end = cur.ch, start = end;
    while (start && word.test(curLine.charAt(start - 1))) --start;
    var curWord = start != end && curLine.slice(start, end);
    if (curWord) { curWord = curWord.toLowerCase(); }
    var list = options && options.list || [], seen = {};
    var re = new RegExp(word.source, "g");
    for (var dir = -1; dir <= 1; dir += 2) {
      var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;
      for (; line != endLine; line += dir) {
        var text = editor.getLine(line), m;
        while (m = re.exec(text)) {
          if (line == cur.line && m[0].toLowerCase() === curWord) continue;
          if ((!curWord || m[0].toLowerCase().lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {
            seen[m[0]] = true;
            list.push(m[0]);
          }
        }
      }
    }
    list.sort();
    list.reverse();
    let tempList = new Map(list.map(s => [s.toLowerCase(), s]));
    list = [...tempList.values()];
    list.sort();
    var list2 = extraWords.filter(el => el.toLowerCase().startsWith(curWord || ''));
    list2.sort();
    list = list.concat(list2);
    let tempList2 = new Map(list.map(s => [s.toLowerCase(), s]));
    list = [...tempList2.values()];
    list.sort(function (a, b) {
      return a.toLowerCase().localeCompare(b.toLowerCase());
    });
    return { list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end) };
  });
});
 
Zuletzt bearbeitet:

Sempervivum

Senior HTML'ler
OK, dann muss ich meine Empfehlung von oben u. U. wieder in Frage stellen: Das Umändern des Javascript könnte komplizierter werden als das Umändern der Regex für jemand der sich sehr gut damit auskennt. Wobei letzteres für mich nicht zutrifft. Aber vielleicht meldet sich da noch jemand mit erweiterten Kenntnissen.
 

chromo23

Neues Mitglied
Ich hatte einen Gesitesblitz und plötzlich habe ich es verstanden...
An der Stelle wo der Text in "lines" aufgeteilt wird hab ich einfach den Text per regex gefiltert:

Javascript:
for (; line != endLine; line += dir) {
        var text = editor.getLine(line), m;
        text = text.replace(/\/{2}.*/g,'');  //eine kleine, einfache Zeile
        while (m = re.exec(text)) {

@Sempervivum danke für den freundlichen "Arschtritt" im zweiten Post.. das hilft manchmal für eine andere Perspektive
 

Sempervivum

Senior HTML'ler
Super, dass Du die Lösung gefunden hast! Dann war es ja doch viel einfacher als ich beim ersten Überfliegen des Codes angenommen hatte.
 
Werbung:

Neueste Beiträge

Oben