2009-07-15 12 views
-2

Ich arbeite an einem ASP.NET-Antwortfilter, der URLs neu schreibt, um in bestimmten Situationen auf eine andere Domäne zu verweisen.Hilfe mit negativem Lookbehind in regulären Ausdrücken

Da ASP.NET Chunks die Antwort schreibt, wird mein Filter mehrmals aufgerufen, bevor die Seite vollständig gestreamt wird. Das bedeutet, dass ich darauf achten muss, dass jeder Aufruf von Regex.Replace eine URL nicht doppelt ersetzt (Sie enden mit http://foo.comhttp://foo.com/path).

Um dies zu tun, ich versuche Ausdruck eine negative Lookbehind für das Ersetzen zu verwenden, aber es scheint nicht zu funktionieren:

content = Regex.Replace(content,"((?<!" + newDomain + ")" + match + ")", newDomain + match); 

Dies schafft eine regex wie:

((?<!http://www.foo.com/)actual/url) 

Allerdings scheint es nicht den Look zu respektieren und ich bekomme alles doppelt ersetzt.

Irgendwelche Ideen?

EDIT: Diese Regex funktioniert gut, wenn ich ein Werkzeug wie Regex Coach verwenden, um es gegen Beispieldaten zu testen.

EDIT 2: Hinzugefügt den Schrägstrich, es ist tatsächlich da.

+0

Wo genau ist das "Match" Variable kommen? Um genau zu sein, haben Sie sie durch Parsing der URLs aus dem Inhalt erhalten? Wie sieht "Übereinstimmung" vor dieser Zeile aus? – mercator

+0

Möchten Sie die Domain oder den Pfad ersetzen? Wie du sagst, bekommst du die Matches, die du in Regex Coach erwartest, aber du bekommst nicht die Ersatzaktion, die du erwartest. –

+0

Wow, -1 zu allen meinen Antworten, ohne Feedback. –

Antwort

1

Ein paar Gedanken:

  • Haben Sie die entkommen müssen. in der Regex? Ich kenne die Syntax <! nicht und habe meine Bücher nicht zur Hand, also kann dies ein strittiger Punkt sein.
  • Ich sehe nicht, wie es http://www.foo.com/something übereinstimmen würde, da es in Ihrem Beispiel keine/nach der www.foo.com gibt.

Hoffe, dass einige davon helfen.

0

würde ich versuchen, diese

content = Regex.Replace(content,"(?<!" + newDomain + ")^[^/]+/(?=" + match + ")", newDomain + match); 

Dieses Match wird (und damit den Domänenteil auf dem Ausdruck ersetzen) ist nur die Domäne nicht NEWDOMAIN und der Weg ist Spiel.

+0

warum die down vote? löst es das Problem nicht, wenn ja, bitte erklären Sie warum? Wir sind keine psychischen Debugger –

0

Vielleicht vermisse ich etwas, aber sollten Sie negative Lookbehinds überhaupt verwenden? Ein Lookbehind, von Natur aus, wird nichts zusammenbringen. Während Sie die Domäne und den Pfad anpassen und dann die Domäne ersetzen möchten. Recht?

So sollte es etwas mehr so ​​aussehen:

Regex.Replace("http://www.foo.com/something", "(http://www.foo.com/)(something)", "http://www.abc.com/$2") 

Die Idee ist, zu Ihrem Vorteil nutzen zu gruppieren. Das ist der Punkt, an dem der $ 2-Teil die zweite Hälfte des Spiels (den Pfad) ergreift und an die neue Domäne anfügt. Ich habe das in Regex Hero (ein .NET-Regex-Tester) getestet und es funktioniert. Der Regex-Coach ist übrigens Perl-basiert und Sie können beim Vergleich mit der .NET-Regex-Engine einige Unterschiede feststellen.

2

Ich werde einen dritten Winkel versuchen.

Ich denke, dass Sie diese Tatsache verwirren Ihre Regex "passt" etwas in Regex Trainer, damit es den Teil, den Sie wollen. Daher sind Sie von den Ersetzungsergebnissen überrascht.

die ersetzen Swaps alle übereinstimmenden Eingang für das neue Token. Der negative Lookbehind stellt sicher, dass das Muster nicht vorhanden ist, aber das Muster ist nicht Teil des übereinstimmenden Eingangs.

Die Ergebnisse, die Sie erhalten, sind, weil nur der Pfad (Ihre Übereinstimmungszeichenfolge) Ihrer URL die übereinstimmende Eingabe ist und Sie diese durch die Variable newDomain ersetzen.

Deshalb erhalten Sie die Ergebnisse, die Sie bekommen.

0

Wie wäre es mit der Idee, es nur zu ersetzen, wenn Sie den zu ersetzenden Domain-Teil nicht in der Zeichenfolge finden?

Das heißt, zu missbrauchen Perl als Kürzel:

if ($string !~ /foo\.com) { 
    $string = $domain . $string; 
} 
Verwandte Themen