2013-12-18 11 views
11

Uznalbym siebie za biegły w rozumieniu wyrażeń regularnych; po raz pierwszy byłem zaskoczony, a ostatnie 20 minut wyszukiwania go/wyszukiwania SO dla odpowiedzi nic nie dało.Dopasowanie wyrażenia JavaScript * nie * początek linii

Rozważmy ciąg:

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

I chcę, aby zastąpić lub chwytania (lub zrobić coś z) każde wystąpienie "FR" (wielkość liter ma znaczenie).

mogłem użyć, po prostu:

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

Jednak co zrobić, jeśli chciałam zignorować bardzo pierwsze wystąpienie „FR”? Zazwyczaj używałbym pozytywnego lookbehind (na przykład (?<=.)fr w php), ale nasz przyjaciel javascript tego nie robi. Bez zainstalowania biblioteki stron trzecich, czy jest jakiś sposób, aby upewnić się, że moje wyrażenie NIE pasuje na początku linii?

Aktualizacja: Chociaż istnieją sposoby zastąpienie zrobionego $1, mój szczególności use-case jest split() tutaj, i wymagałoby naprawek tablicę po fakcie jeśli kiedyś coś podobnego sugestię @Explosion pigułki string.replace(/^(fr)|fr/gi, "$1");

+0

Kiedy nie lookbehind, dopasować go w podciąg wzorca i włożyć ją z powrotem: 'zastąpić (/) (FR/pokarmowego, '$' 1andthensomereplace.)'. – Wrikken

+0

@Wrikken moim faktycznym przypadkiem użycia jest tu 'split()' - muszę podzielić na złożone wyrażenie, więc jak dodać to z powrotem do podziału? – brandonscript

+0

@ r3mus jakiej tablicy szukasz? Co masz na myśli przez rekompilację po fakcie? –

Odpowiedz

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

Pozostaje ci ["Friends of mine are ", "om ", "ance and they love to ", "olic."]

+0

Ah, ale obejmuje to poprzedzający znak w przechwytywaniu; gdybym robił coś takiego jak "split()" na tym, spowodowałoby to wiele komplikacji. Co więcej, gdyby w ciągu znaków było słowo "Alfred", zastąpiłoby ono 'lfr'. – brandonscript

+0

@ r3mus Masz rację - zaktualizowano. – Matt

+0

Śmiem twierdzić, myślę, że już to zrobiłeś. – brandonscript

3

można po prostu iść drogą najmniejszego oporności i użytkowania pobierania/naprzemiennie:

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

Jak napisałem do @Wrikken, moim faktycznym przypadkiem użycia tutaj jest split() - muszę podzielić na złożone wyrażenie, więc jak mógłbym dodać to z powrotem do podziału? – brandonscript

+0

@ r3mus możesz chcieć zaktualizować swoje pytanie, ponieważ mogłoby to znacznie zmienić odpowiedź. Jeśli masz grupę przechwytywania z 'split', przechwycony wzór jest zawarty w wyniku. Zamień powyższy na '.split', aby zobaczyć co mam na myśli. –

+0

Tak, gotowe. Słuszna uwaga. Mimo to, świetna propozycja, gdy tylko * nie * używam 'split()'. – brandonscript

1

Mogę spróbować /(?!^)fr/gi. Zasadniczo, pasuje tylko wtedy, gdy asercja początku ciągów nie przejdzie.

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

Być może czytałem to źle, ale czy nie skutecznie odciąłeś pierwszego 'Fr'? To część danych; nie można go po prostu zgrać bez jego zwrotu. – cHao

+0

Dzięki @cHao, edytowałem kod. –

Powiązane problemy