Eine Zeichenkette * und * ihre Teilstrings in einem Heuhaufen finden

8

Angenommen, Sie haben eine Zeichenfolge (z. B. needle ). Seine 19 kontinuierlichen Teilstrings sind:

%Vor%

Wenn ich eine Regex erstellen würde, die im Heuhaufen passt, könnte ich einfach irgendeinen der Teilstrings tun:

%Vor%

aber es sieht nicht wirklich elegant aus. Gibt es eine bessere Möglichkeit, eine Regex zu erstellen, die gierig mit einem der Teilstrings einer gegebenen Zeichenfolge übereinstimmt?

Zusätzlich, was, wenn ich eine andere Einschränkung stellte, wollte nur Teilstrings passen, die länger als ein Schwellenwert sind, z.B. für Teilstrings von mindestens 3 Zeichen:

%Vor%

Hinweis: Ich habe bewusst keinen bestimmten Regex-Dialekt erwähnt. Bitte geben Sie an, welche Sie in Ihrer Antwort verwenden.

    
CAFxX 21.01.2012, 17:09
quelle

4 Antworten

4

Wie von Qtax vorgeschlagen, der Ausdruck

n(e(e(d(l(e)?)?)?)?)?|e(e(d(l(e)?)?)?)?|e(d(l(e)?)?)?|d(l(e)?)?|l(e)?|e

wäre der Weg zu gehen, wenn Sie einen expliziten regulären Ausdruck schreiben möchten ( egrep Syntax, optional ersetzen Sie (...) durch (?:...) ). Der Grund, warum dies besser als die anfängliche Lösung ist, ist, dass die komprimierte Version nur O (n ^ 2) Speicherplatz im Vergleich zu O (n ^ 3) Leerzeichen in der ursprünglichen Version benötigt, wobei n die Länge der Eingabe ist. Versuchen Sie dies mit extraordinarily als Eingabe, um den Unterschied zu sehen. Ich denke, die komprimierte Version ist auch schneller mit vielen Regexp-Engines da draußen.

Der Ausdruck

nee(d(l(e)?)?)?|eed(l(e)?)?|edl(e)?|dle

sucht nach Teilzeichenfolgen der Länge 3 oder länger.

Wie von vhallac hervorgehoben, sind die erzeugten regulären Ausdrücke ein wenig redundant und können optimiert werden. Neben dem vorgeschlagenen Emacs-Tool gibt es ein Perl-Paket Regexp :: Optimizer < Ich hoffe, dass es hier helfen würde, aber eine schnelle Überprüfung fehlgeschlagen für den ersten regulären Ausdruck.

Beachten Sie, dass viele Regexp-Engines standardmäßig eine nicht überlappende Suche durchführen. Überprüfen Sie dies mit den Anforderungen Ihres Problems.

    
krlmlr 30.01.2012 21:57
quelle
3

Ich habe eine elegante Lösung gefunden, je nachdem, wie schlecht Sie nur eine Regexp brauchen. Zum Beispiel ist hier die Regexp, die gemeinsame Teilzeichenfolge (Perl) der Länge 7 findet:

%Vor%

Die passende Zeichenfolge befindet sich in \ 1 . Zeichenfolgen sollten kein Nullzeichen enthalten, das als Trennzeichen verwendet wird.

Sie sollten einen Zyklus machen, der mit der Länge der Nadel beginnt und bis zum Grenzwert schwingt und versucht, die Regexp anzupassen.

    
gorn 02.02.2012 17:47
quelle
1
  

Gibt es eine bessere Möglichkeit, eine Regex zu erstellen, die mit einem der beiden übereinstimmt?   Teilstrings einer gegebenen Zeichenfolge?

Nein. Aber Sie können einen solchen Ausdruck leicht erzeugen.

    
Qtax 21.01.2012 17:23
quelle
-2

Vielleicht suchen Sie nur .*(.{1,6}).*

    
mtanti 01.02.2012 18:04
quelle

Tags und Links