2012-03-01 15 views

Odpowiedz

6

Pozwól mi rozwiązać te w odwrotnej kolejności:

Co robię źle?

Chcesz użyć +, a nie *. * oznacza zero lub więcej pasuje, co nie ma sensu tutaj. + oznacza jeden lub więcej dopasowań. Więc:

"aaa\nbbb\nccc".replace(/.+/g, ".") 
// ".\n.\n." 

Należy również pamiętać, że jeśli nie używasz ^ lub $ (Twój pierwszy przykład), nie trzeba modyfikator m (ale to nie był problem z tym, co robisz). I nie potrzebujesz ^ lub $ ponieważ .doesn't match newlines (coś, czego nie wiedziałem przed udzieleniem odpowiedzi na to pytanie).

Dlaczego funkcja javascript zastępuje funkcję string?

Nie mam ziemskiego pomysłu i mam nadzieję, że ktoś inny to robi.

Ponownie, używając * mówisz zero lub więcej dopasowań. Więc pasuje do wszystkich odpowiednich znaków, zastępując je pierwszą kropką; następnie pasuje do zero znaków, zastępując je jedną kropką. Wynik: dwie kropki.

Dowód:

Live copy | Live source

"aaa\nbbb\nccc".replace(/.*/g, function(m) { 
    console.log("m = '" + m + "'"); 
}); 

Wyjścia:

m = 'aaa' 
m = '' 
m = 'bbb' 
m = '' 
m = 'ccc' 
m = ''
+0

Uwielbiam "źródło na żywo". Świetne wyjaśnienie. –

+0

Świetne wyjaśnienie, to zasługuje na + a_lot. Nie wiedziałem, że '.' nie pasuje również do nowych znaków. –

3

Zapraszamy do obejrzenia tej instrukcji:

"aaa\nbbb\nccc".replace(/(.*)/gm, ".$1.") 

produkuje:

".aaa... 
.bbb... 
.ccc..." 

.* meczów aaa i zastępuje go przez .aaa., a następnie dopasowuje pusty łańcuch i zastępstwo przez ...

To samo zachowanie po wymianie .* przez .

jak powiedział T. J.Crowder, użyj jednego Zamiast: .+

"aaa\nbbb\nccc".replace(/.+/g, ".") 
1

Niespodziewanie, przewiduje się zachowanie. Pusty ciąg spełnia wyrażenie regularne .*:

/.*/.test(""); 
// true 

/.*/.exec(""); 
// [""] 

Aby zrozumieć, co się dzieje, zawiadomienie wyjście:

"aaa\nbbb\nccc".match(/.*/g); 
// ["aaa", "", "bbb", "", "ccc", ""] 
// m flag dropped because^and $ are not used 

pamiętając, że . nie pasuje \n, mecz-wymiana odbywa w następujący sposób:

  • .* mecze aaa
  • z powodu g flagą, łańcuch po aaa jest poszukiwany meczu
    • .* mecze "" - ciąg zerowej długości po aaa i przed \n
    • .* nie pasuje \n
    • .* mecze bbb
    • .* pasuje "" - ciąg o zerowej długości po bbb i przed \n

I tak dalej. Po prostu użyj .+, aby uniknąć dopasowania pustych ciągów.

+0

". * Nie pasuje \ n". Dobrze wiedzieć. –

Powiązane problemy