2013-12-18 18 views
11

Mi considererei abile nel comprendere le espressioni regolari; per la prima volta, sono stato perplesso, e gli ultimi 20 minuti di googling/ricerca SO per la risposta non hanno prodotto nulla.corrispondenza regex Javascript * non * inizio riga

consideri la stringa:

var string = "Friends of mine are from France and they love to frolic." 

e voglio sostituire o cattura (o fare qualcosa con) ogni occorrenza di "fr" (case insensitive).

ho potuto utilizzare, è sufficiente:

var replaced = string.replace(/fr/gi); 

Tuttavia, quello che se avessi voluto ignorare la prima occorrenza di "fr"? Normalmente userei un look-look positivo (per esempio, (?<=.)fr in php) per farlo, ma il nostro amico javascript non lo fa. Senza installare una libreria di terze parti, esiste un modo per garantire che la mia espressione NON corrisponda all'inizio della riga?

Aggiornamento: Mentre ci sono mezzi di sostituzione con l'catturato $1, il mio particolare caso d'uso è split() qui, e richiederebbe fissare l'array dopo il fatto se ho usato qualcosa come suggerimento @Explosion pillole string.replace(/^(fr)|fr/gi, "$1");

+0

Quando nessun lookbehind, corrisponde in una sotto-regola e inserirlo di nuovo in: 'sostituire (/() fr/gi, '$ 1andthensomereplace'.)'. – Wrikken

+0

@Wrikken il mio caso d'uso attuale è 'split()' - Ho bisogno di dividere su un'espressione complessa, quindi come aggiungerei di nuovo in una divisione? – brandonscript

+0

@ r3mus quale array stai cercando? Cosa intendi per ricompilare dopo il fatto? –

risposta

15
string.split(/(?!^)fr/gi); 

Questo ti lascia con ["Friends of mine are ", "om ", "ance and they love to ", "olic."]

+0

Ah, ma questo include il carattere precedente nell'acquisizione; se facessi qualcosa come 'split()' su di esso, ciò causerebbe molte complicazioni. Inoltre, se ci fosse una parola come "Alfred" nella stringa, sostituirà 'lfr'. – brandonscript

+0

@ r3mus Hai ragione - aggiornato. – Matt

+0

Oserei dire, penso che tu l'abbia fatto. – brandonscript

3

si potrebbe semplicemente andare il percorso di minor resistenza e l'uso di cattura/alternanza:

0.123.
string.replace(/^(fr)|fr/gi, "$1"); 
+0

Come ho scritto a @Wrikken, il mio caso d'uso attuale qui è split() - Ho bisogno di dividere su un'espressione complessa, quindi come aggiungerei di nuovo in una divisione? – brandonscript

+0

@ r3mus potresti voler aggiornare la tua domanda in quanto ciò potrebbe sostanzialmente modificare la risposta. Se hai un gruppo di cattura con 'split', il modello catturato è incluso come risultato. Sostituisci il precedente con '.split' per vedere cosa intendo. –

+0

Sì, fatto. Buon punto Comunque, ottimo suggerimento per quando non sto * usando * split() '. – brandonscript

1

Potrei provare /(?!^)fr/gi. Fondamentalmente, si abbinano solo dove non passa una dichiarazione di inizio stringa.

0
var string = "Friends of mine are from France and they love to frolic." 
var replaced = string.replace(/(.)fr/gi,'$1||').split('||') 
1
var string = "Friends of mine are from France and they love to frolic." 
var replaced; 
if(string.substr(0, 2).toLowerCase() == "fr"){ 
replaced = string.substr(0, 2)+string.substr(2).replace(/fr/gi); 
} 
else{ 
replaced = string.replace(/fr/gi); 
} 
+1

Potrei leggere questo errore, ma non stai effettivamente tagliando il primo 'Fr'? Questa è parte dei dati; non puoi semplicemente strapparlo senza rimetterlo in qualche modo. – cHao

+0

Grazie a @cHao, ho modificato il codice. –

Problemi correlati