2016-05-19 16 views
0

In einem node.js Server ich URL-Adressen mit Hilfe von JavaScript konvertieren müssen Sie wie folgt vor:Bedingtes ersetzen String mit Regular Expression

Beispiel 1:

hostA/blah/dir1/name/id.js?a=b --> name.hostC/dir2.js?guid=id&a=b 

Beispiel 2:

hostB/dir1/name/id.js --> name.hostC/dir2.js?guid=id 

Die Konvertierung erfolgt mit string.replace unter Verwendung von regulären Ausdrücken in einer Konfigurationsdatei.

Bisher habe ich:

url.replace(/.*\\/dir1\\/(.*)\\/\\(d{2})\\.js?:(?=\?)(.*)/, "$1.hostC\/dir2.js?guid=$2"); 

Der Ersatz-String gibt ?guid=id. Wie ändere ich den Ausdruck oder den ersetzenden String, so dass (beachten Sie das kaufmännische Und) im Fall von Beispiel 1 hinzugefügt werden und nichts im Fall von Beispiel 2 hinzugefügt?

+0

Ist [dies] (https://regex101.com/r/fJ7oW9/1) was Sie suchen? –

+0

@ThomasAyoub Im ersten Testfall muss das zweite '?' In ein '&' geändert werden (daher die Schwierigkeit). – 4castle

Antwort

0

Sie können so etwas wie

/([^/]+)\/([^./]+)\.js(?:\?(.*))?$/ 

Beispiel

> "hostA/blah/dir1/name/id.js".replace(/([^/]+)\/([^./]+)\.js(?:\?(.*))?$/, "$1.hostC/dir2.js?guid=$2&$3") 
< "hostA/blah/dir1/name.hostC/dir2.js?guid=id&" 

> "hostA/blah/dir1/name/id.js?a=b".replace(/([^/]+)\/([^./]+)\.js(?:\? 
(.*))?$/, "$1.hostC/dir2.js?guid=$2&$3") 
< "hostA/blah/dir1/name.hostC/dir2.js?guid=id&a=b" 

schreiben Wenn das nachlauf & ein Problem ist, können Sie die Regex in zwei Anweisungen brechen,

< "hostA/blah/dir1/name/id.js".replace(/([^/]+)\/([^./]+)\.js$/, "$1.hostC/dir2.js?guid=$2") 
> "hostA/blah/dir1/name.hostC/dir2.js?guid=id" 

> "hostA/blah/dir1/name/id.js?a=b".replace(/([^/]+)\/([^./]+)\.js(?:\?(.*))$/, "$1.hostC/dir2.js?guid=$2&$3") 
< "hostA/blah/dir1/name.hostC/dir2.js?guid=id&a=b" 
+0

Sie wollen keine abschließenden '&' in der URL. * nichts hinzugefügt im Fall von Beispiel 2 * – 4castle

+0

Was ist mit 'hostA/blah/dir1/name/id.js? a = b? b = c'? –

+0

@ThomasAyoub Ich nehme an, das ist keine gültige URL – nu11p01n73R

1

Dies wird für die Beispiele funktionieren:

text.replace(/.*?\/dir1\/([^\/]+)\/(.*?)\.js\??(.*)/i, "$1.hostC/dir2.js?guid=$2&$3").replace(/&$/, "") 

Sie können die Regex-Optionen ändern ‚g‘ oder ‚m‘ zu schließen, wenn in Ihrer Implementierung gefordert.

+0

Dies beantwortet meine Frage nicht, aber das ist, was ich getan habe, da es wie ein einziger Ausdruck aussieht, zu tun, was ich will, ist zu komplex. – Dondey