• 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:
Werbung:
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:
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
 
Werbung:
Zurück
Oben