2017-07-12 2 views
0

Ich habe die folgende Zeichenfolge:Ersetzen bestimmter Teile eines Strings

dynamic[elements][0][slider][image1] 

Welche könnte auch sein:

dynamic[elements][0][slider][image1] 
dynamic[elements][0][abc][image1] 
dynamic[elements][0][static][image1] 
dynamic[elements][0][fronter][image1] 
dynamic[elements][0][xyz][image1] 

Dass ich zuerst möchte „dynamisch“ zu „main“ ändern, und dann Schieber, abc, statisch, Fronter oder xyz (oder etwas ganz anderes) auf „Wert“

So ist die Lösung die ich suche sollte zurückgeben:

main[elements][0][value][image1] 
main[elements][0][value][image1] 
main[elements][0][value][image1] 
main[elements][0][value][image1] 
main[elements][0][value][image1] 

Wie kann dies erreicht werden? Ich denke, dass ein pregex, die die dritte [] zielen könnte eine Lösung sein, so habe ich versucht, die folgend:

var line = 'dynamic[elements][0][value][image1]'; 
line.replace('dynamic', 'main'); 
line.replace(/\[.*?\]/g, 'value'); 

Aber ich weiß nicht, wie die dritten Klammern Inhalt und der obige Versuch ersetzen funktioniert nicht wirklich .

+0

wenn das dritte Token ist der einzige numerische Index 'line.replace (/ \ [\ d + \] \ [(. *?) \]/"[Wert]") ' –

Antwort

3

können Sie verwenden

.replace(/^[^\][]*(\[[^\][]*]\[\d+]\[)[^\][]*(].*)/g, 'main$1value$2') 

die regex demo See.

Einzelheiten:

  • ^ - Beginn der Zeichenfolge
  • [^\][]* - 0+ Zeichen andere als [ und ]
  • (\[[^\][]*]\[\d+]\[) - Gruppe 1 Treffer:
    • \[ - eine wörtliche [
    • [^\][]*-0 oder mehr Zeichen anders als [ und ]
    • ]\[ - a literal ][ Teilzeichenfolge
    • \d+-1 oder mehr Ziffern
    • ]\[ - a literal ][ Teilzeichenfolge
  • [^\][]* - 0 + Zeichen außer [ und ]
  • (].*) - Gruppe 2, die mit ] übereinstimmt und dann alle 0+ Zeichen außer Zeilenumbruchzeichen.

Hinweis: Die ] innerhalb einer Zeichenklasse muss maskiert werden, während, wenn sie außerhalb der Zeichenklasse, ist es nicht entgangen sein muss.

Die main$1value$2 ist das Ersetzungsmuster main am Anfang eingeführt wird, dann Einfügen Gruppe 1 Inhalts (mit $1 Rückreferenzierung), dann wird das Einfügen value und dann wird der Inhalt der Gruppe 2.

var ss = ['dynamic[elements][0][slider][image1]', 'dynamic[elements][0][abc][image1]', 'dynamic[elements][0][static][image1]', 'dynamic[elements][0][fronter][image1]', 'dynamic[elements][0][xyz][image1]']; 
 
var rx = /^[^\][]*(\[[^\][]*]\[\d+]\[)[^\][]*(].*)/g; 
 
var subst = "main$1value$2"; 
 
for (var s of ss) { 
 
console.log(s, "=>", s.replace(rx, subst)); 
 
}

+0

Beste erklärte Antwort. Ich habe es nicht einmal geschafft, meine Regex zu beenden. Gut gemacht! – BrightOne

+0

Sehr abgeschlossen. Als Randnotiz wäre es nicht einfacher, zuerst "dynamisch", wie vom OP vorgeschlagen, zu ersetzen. PS: Herzlichen Glückwunsch zu deinem 200k; P – Mistalis

+0

@Mistalis: Danke. Es ist möglich, in mehreren Schritten zu ersetzen, sicher ist es sogar möglich, eine Callback-Methode zu verwenden, um '\ [. *?]' Übereinstimmungen zu zählen, um die notwendige mit dem erforderlichen 'Wert' zu ersetzen. Es scheint jedoch eine einzige Regex-Lösung mit einfangenden Gruppen zu genügen. –

Verwandte Themen