[regex] Bestimmte Zeichenfolge ist unerwünscht?

Matthiasnet

Well-known member
ID: 116869
L
14 August 2006
271
7
Hallo,

ich habe einen längeren reg ex Ausdruck für MySQL(=POSIX Extended Regular Expressions), wo ich bei einem Part nicht weiter komme.

Ich möchte, dass beliebig viele Zeichen außer "; vorkommen, dann das Wort xyz und dann wieder beliebig viele Zeichen außer ";.

Also so in der Art:
[^";]*ein[^";]*";

Wobei "; einzeln vorkommen dürfen, jedoch nicht zusammen in der Konstelation. ("; markiert nämlich das Ende meines Suchstrings)

Hat jemand eine Idee wie ich das umsetzen kann?
Klammerung hat leider nicht geholfen...

Grüße
Matthiasnet
 
Zuletzt bearbeitet:
kannst du mal ein konkretes beispiel geben?
also, source und gewünschtes ergebnis

edit:
würde jetzt ausm stand folgendes sagen, aber ohne gewähr, da details unbekannt:

PHP:
$regex = '~(?<!";)(.*)(?!";)~';
+ preg_match_all
 
Zuletzt bearbeitet:
Ich würde folgendes vorschlagen:
Code:
#";(.*?)";#
Das ? macht den * ungierig.
https://de.php.net/manual/de/regexp.reference.repetition.php:
By default, the quantifiers are "greedy", that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences /* and */ and within the sequence, individual * and / characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ to the string /* first comment */ not comment /* second comment */ fails, because it matches the entire string due to the greediness of the .* item.

However, if a quantifier is followed by a question mark, then it becomes lazy, and instead matches the minimum number of times possible, so the pattern /\*.*?\*/ does the right thing with the C comments. The meaning of the various quantifiers is not otherwise changed, just the preferred number of matches. Do not confuse this use of question mark with its use as a quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in \d??\d which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches.
 
Danke für die Antworten.
Der Regex-Ausdruck wird in MySQL verwendet.
Leider fällt mir jetzt erst auf, dass MySQL nur POSIX Extended Regular Expressions unterstützt.
Weiter unten auf der Seite https://www.regular-expressions.info/refflavors.html POSIX ERE dargestellt.

So wird also kein lookbehind, lookahead und non-greedy Ausdruck unterstützt.
Kennt jmd noch eine andere Möglichkeit?

In einer Spalte einer MySQL-Tabelle wird ein serialize Array mit verschiedenen Elementen gespeichert.
Nun möchte ich auf bestimmte Key´s den value durchsuchen lassen und bei Erfolg mir den Datensatz ausgeben lassen.
Momentan lautet meine Where-Klausel wie folgt:
Code:
WHERE content REGEXP 's:[0-9]{1,}:"inhalt[1-3]";s:[0-9]{1,}:"[^";]*Suchwort[^";]*";'
 
Zuletzt bearbeitet:
Na wenn das so ist, würde ich einfach mal die Datenbank normalisieren und schon kannst du dir den Mist sparen.
 
Ist noch mehr Aufwand.
Hab (leider) schon 3 gefüllte Projekte mit verschiedenen Elementen nach diesem Muster aufgebaut.

In Zukunft werde ich eine eigene Tabelle für die Arrays verwenden.

Gibts sonst keine andere Möglichkeit das noch über MySQL zu regeln?
Worst case alternative wäre leider wirklich, sich die Inhalte in php zu ziehen und die Prüfung dort laufen zu lassen...leider nicht wirklich effizient.
 
Mehr Aufwand?
Ein Skript schreiben, was die Datenbank ausliest, die Arrays entserialisiert (ist das Gegenteil von seriell nicht parallel?) und in die neue Datenbank wieder einfügt, aus der sie dann in Zukunft simpel und performant (!) ausgelesen werden können, kann nicht viel mehr Arbeit sein, als sich hier noch Stunden den Kopf über einen umständlichen Workaround zu zerbrechen. Und der Geschwindigkeitsvorteil rechtfertigt dieses bisschen Mehrarbeit allemal.