Jak mówi tytuł, mam ciąg i chcę podzielić na segmenty n znaków.
Na przykład:
var str = 'abcdefghijkl';
po odrobinie magii n=3
stanie się
var arr = ['abc','def','ghi','jkl'];
Czy jest na to sposób?
Jak mówi tytuł, mam ciąg i chcę podzielić na segmenty n znaków.
Na przykład:
var str = 'abcdefghijkl';
po odrobinie magii n=3
stanie się
var arr = ['abc','def','ghi','jkl'];
Czy jest na to sposób?
var str = 'abcdefghijkl';
console.log(str.match(/.{1,3}/g));
Uwaga: Użyj {1,3}
zamiast tylko {3}
dołączyć resztę dla długości łańcucha, które nie są wielokrotnością 3, np .:
console.log("abcd".match(/.{1,3}/g)); // ["abc", "d"]
Kilka innych subtelności:
.
nie przechwytuje ich. Użyj /[\s\S]{1,3}/
zamiast tego. (Dzięki @Mike).match()
wróci, null
gdy będziesz oczekiwać pustej tablicy. Zabezpiecz się przed tym, dołączając || []
.Więc możesz skończyć z:
var str = 'abcdef \t\r\nghijkl';
var parts = str.match(/[\s\S]{1,3}/g) || [];
console.log(parts);
console.log(''.match(/[\s\S]{1,3}/g) || []);
[\s\S]
zamiast,.
aby nie zawieść na nowych liniach.''.match(/.{1,3}/g)
i''.match(/.{3}/g)
wróćnull
zamiast pustej tablicy.Jeśli nie chcesz używać wyrażenia regularnego ...
jsFiddle .
... w przeciwnym razie rozwiązanie wyrażenia regularnego jest całkiem dobre :)
źródło
3
jest zmienna, jak sugeruje OP. Jest bardziej czytelny niż łączenie wyrażenia regularnego.źródło
3
mnie, ale wracanull
z250
. 🤔Opierając się na poprzednich odpowiedziach na to pytanie; następująca funkcja podzieli ciąg (
str
) liczby n (size
) znaków.Próbny
źródło
Moje rozwiązanie (składnia ES6):
Możemy nawet stworzyć funkcję z tym:
Następnie możesz łatwo wywołać funkcję w sposób wielokrotnego użytku:
Twoje zdrowie
źródło
Czyste rozwiązanie bez REGEX
źródło
Powyższa funkcja jest tym, czego używam do dzielenia na Base64. Utworzy to łamanie linii w liczbie 75 znaków.
źródło
replace(/.{1,75}/g, '$&\n')
.Tutaj przeplatamy ciąg z innym ciągiem co n znaków:
jeśli wykorzystamy powyższe w ten sposób:
otrzymujemy:
i tutaj robimy to samo, ale wypychamy do tablicy:
a następnie uruchom:
otrzymujemy:
jeśli ktoś zna sposób na uproszczenie powyższego kodu, lmk, ale powinien działać dobrze dla łańcuchów.
źródło
Niektóre czyste rozwiązania bez użycia wyrażeń regularnych:
Przykład użycia - https://jsfiddle.net/maciejsikora/b6xppj4q/ .
Próbowałem także porównać moje rozwiązanie, aby regexp wybrać jako właściwą odpowiedź. Niektóre testy można znaleźć na jsfiddle - https://jsfiddle.net/maciejsikora/2envahrk/ . Testy pokazują, że obie metody mają podobną wydajność, być może na pierwszy rzut oka rozwiązanie wyrażenia regularnego jest nieco szybsze, ale osądź je sam.
źródło
Z
.split
:i
.replace
będzie:/(?!$)/
ma się zatrzymać przed końcem/$/
, bez jest:ignorowanie grupy
/(?:
...)/
nie jest konieczne,.replace
ale w.split
dodaje grupy do arr:źródło
Oto sposób na zrobienie tego bez wyrażeń regularnych lub wyraźnych pętli, choć nieco rozszerza to definicję jednej linijki:
Działa poprzez podzielenie łańcucha na tablicę pojedynczych znaków, a następnie
Array.reduce
iterację każdego znaku. Normalniereduce
zwróciłoby pojedynczą wartość, ale w tym przypadku pojedyncza wartość jest tablicą, a gdy przekazujemy każdy znak, dołączamy go do ostatniego elementu w tej tablicy. Gdy ostatni element w tablicy osiągnie docelową długość, dodajemy nowy element tablicy.źródło
Wracam nieco później do dyskusji, ale tutaj jest to wariant nieco szybszy niż substring + tablica push.
Wstępne obliczanie wartości końcowej jako części pętli for jest szybsze niż wykonywanie wbudowanej matematyki wewnątrz podłańcucha. Przetestowałem to zarówno w Firefoksie, jak i Chrome, i oba pokazują przyspieszenie.
Możesz spróbować tutaj
źródło