2017-04-17 8 views
1

Spiele habe ich zwei Strings, dieRegex UND-Operator für überlappende

chriscattano 
christiancattano 

I Substrings in Längen von 3 bis 10 haben, dass beide Saiten teilen

(chr)(hri)(ris)(cat)(att)(tta)(tan)(ano)(chri)(hris)(catt)(atta)(ttan)(tano)(chris)(catta)(attan)(ttano)(cattan)(attano)(cattano) 
Längen von meinem Namen unterschiedlichen

Ich versuche, diese in eine Regex-Suche, die die Wörter chris und cattano erfolgreich übereinstimmen, so dass ich tun kann .replace, und wenden Sie eine <span> mit einer Sass-Klasse auf die Ergebnisse des Spiels.

Wenn ich meine Regex formatiert zu sein:

/(chr)|(hri)|(ris)|(cat)|(att)|(tta)|(tan)|(ano)|(chri)|(hris)|(catt)|(atta)|(ttan)|(tano)|(chris)|(catta)|(attan)|(ttano)|(cattan)|(attano)|(cattano)/g 

Ich schaffe es auf chr und cattan zu einander passen, aber ich kann nicht herausfinden, wie chris und cattano hervorzuheben; Ich vermisse die is und die o.

Dieses Beispiel kann sich drastisch ändern, da ich nur meinen Namen verwende, um die Funktionalität zu testen und zu perfektionieren. Es wird schließlich für E-Mail-Adressen, Namen und Adressen verwendet. Also die Reihenfolge der Capture-Gruppen zu ändern (wenn das das beheben könnte) ist keine Lösung und wenn es dynamischer gemacht wird, habe ich wenig Kontrolle über die Reihenfolge der Captures-Gruppen, wenn sie in ein Regex-Objekt eingefügt werden, und als Parameter der .replace() Methode zugeführt.

Hier ist ein Regexpal, wo ich verschiedene Dinge versucht habe, um es zu markieren, die Spiele, die ich brauche. Hoffentlich könnte jemand es zum Arbeiten basteln?

http://www.regexpal.com/?fam=97413

+0

Was ist Ihr Endziel? Versuchen Sie Code zu schreiben, der die Commons-Teilstrings zweier Strings hervorhebt? Ich habe das Gefühl, dass reguläre Ausdrücke hier nicht die richtige Lösung sind. –

+0

@ Jordan Ja, wenn zwei Strings gegeben sind, habe ich Code, der alle geteilten Teilstrings zwischen den Längen von 3 und 10 extrahiert. Die Idee war, diese Teilstrings würden dann an ein Regex-Objekt ad als Parameter in einer .replace() -Methode verwendet werden . Die Methode .replace() würde die übereinstimmenden Wörter durch einen Bereich ersetzen, der eine Klasse sass enthält, die eine Hintergrundfarbe angibt. Es würde ähnlich aussehen wie h.replace (regexObj, ' $ {regexObj}'); – Chris

+0

Bestellt die Bestellung? Was würden 'chriscattano' und' cattanoXYZchris' ergeben? Es gibt [viele bestehende Arbeiten] (https://www.google.com/search?q=algorithm+find+all+common+substrings) beim Aufzählen gängiger Teilstrings. Haben Sie zwingende Gründe, das Rad neu zu erfinden? –

Antwort

1

Sie müssen die Artikel im Array durch Länge in absteigender Reihenfolge sortieren, um sicherzustellen, dass die längsten Alternativen zuerst getestet, und sie dann mit .join("|") in ein Muster zu verbinden.

Das ist, weil in einem NFA-Regex wie JS oder den meisten anderen die erste gefundene Alternative die Regex-Engine die Verarbeitung der Gruppe beendet. Sie können mehr darüber in Remember That The Regex Engine Is Eager lesen.