Możesz zrobić coś takiego:
"1234567890".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "90"]
Metoda nadal będzie działać z ciągami, których rozmiar nie jest dokładną wielokrotnością rozmiaru porcji:
"123456789".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "9"]
Ogólnie rzecz biorąc, dla każdego łańcucha, z którego chcesz wyodrębnić co najwyżej n- wielkości podciągów, zrobiłbyś:
str.match(/.{1,n}/g); // Replace n with the size of the substring
Jeśli Twój ciąg może zawierać znaki nowej linii lub znaki powrotu karetki, wykonaj następujące czynności:
str.match(/(.|[\r\n]){1,n}/g); // Replace n with the size of the substring
Jeśli chodzi o wydajność, wypróbowałem to z około 10 000 postaci i zajęło to nieco ponad sekundę w Chrome. YMMV.
Można to również wykorzystać w funkcji wielokrotnego użytku:
function chunkString(str, length) {
return str.match(new RegExp('.{1,' + length + '}', 'g'));
}
.
ogóle nie pasuje do nowej linii. Zaktualizuję odpowiedź, aby uwzględniała\n
i\r
uwzględniała.var chunks = str.split("").reverse().join().match(/.{1, 4}/).map(function(s) { return s.split("").reverse().join(); });
. Robi to w kawałkach po 4 sztuki. Nie jestem pewien, co rozumiesz przez „mniej lub więcej”. Pamiętaj, że nie będzie to ogólnie działać, szczególnie w przypadku ciągów znaków zawierających kombinacje znaków, które mogą również łamać ciągi znaków Unicode.[^]
. Dzięki temu twój przykład zaowocujestr.match(/[^]{1,n}/g)
Stworzyłem kilka szybszych wariantów, które można zobaczyć na jsPerf . Moje ulubione to:
źródło
Math.ceil()
aby określić prawidłową liczbę porcji.match
,slice
,substr
isubstring
match
islice
dla różnych rozmiarów porcjimatch
islice
z małą wielkość porcjiDolna linia:
match
jest bardzo nieefektywny,slice
jest lepszy, w Firefoxsubstr
/substring
jest jeszcze lepszymatch
jest jeszcze bardziej nieefektywny w przypadku krótkich ciągów znaków (nawet w przypadku buforowanego wyrażenia regularnego - prawdopodobnie z powodu czasu instalacji wyrażenia regularnego)match
jest jeszcze bardziej nieefektywny w przypadku dużych rozmiarów porcji (prawdopodobnie z powodu niemożności „skoku”)match
wyniki lepszeslice
od starszych IE, ale nadal traci na wszystkich innych systemachźródło
To szybkie i proste rozwiązanie -
źródło
substr()
zamiastsubstring()
.Niespodzianka! Możesz użyć podziału, aby podzielić.
Prowadzi do
[ '12', '34', '56', '78', '90', ' ' ]
źródło
filter (o=>o)
?filter(x=>x)
służy do odfiltrowywania tych pustych elementówźródło
Napisałem rozszerzoną funkcję, więc długość porcji może być również tablicą liczb, na przykład [1,3]
Kod
wróci:
źródło
dzieli duży ciąg znaków na małe ciągi danych słów .
źródło
źródło
Użyłbym wyrażenia regularnego ...
źródło
Nazwij to w razie potrzeby
źródło
Oto rozwiązanie, które wymyśliłem dla ciągów szablonów po małym eksperymentowaniu:
Stosowanie:
źródło
Możesz używać
reduce()
bez wyrażenia regularnego:źródło
reduce
metody.W postaci funkcji prototypowej:
źródło
Oto kod, którego używam, używa String.prototype.slice .
Tak, odpowiedź jest dość długa, ponieważ stara się jak najlepiej przestrzegać aktualnych standardów i oczywiście zawiera rozsądną liczbę komentarzy JSDOC . Jednak po zminimalizowaniu kod ma tylko 828 bajtów, a po przesłaniu do programu gzip do transmisji ma tylko 497 bajtów.
Metodą 1, do której się to dodaje
String.prototype
(używając Object.defineProperty, jeśli jest dostępna) jest:Dołączono szereg testów w celu sprawdzenia funkcjonalności.
Martwisz się, że długość kodu wpłynie na wydajność? Nie musisz się martwić, http://jsperf.com/chunk-string/3
Znaczna część dodatkowego kodu ma zapewnić, że kod będzie reagował tak samo w wielu środowiskach javascript.
źródło
Za pomocą metody slice ():
To samo można zrobić za pomocą metody substring ().
źródło
Mój problem z powyższym rozwiązaniem polega na tym, że ciąg formuje się w kawałki o rozmiarach formalnych, niezależnie od pozycji w zdaniach.
Myślę, że następujące lepsze podejście; chociaż wymaga to trochę ulepszenia wydajności:
źródło
Na pewno możesz zrobić coś takiego
aby to uzyskać:
Jeśli chcesz dynamicznie wprowadzać / dostosowywać wielkość porcji, aby porcje miały rozmiar n, możesz to zrobić:
Aby znaleźć wszystkie możliwe fragmenty rozmiaru n w oryginalnym ciągu, spróbuj tego:
Powinieneś skończyć z:
źródło
źródło
Co z tym małym fragmentem kodu:
źródło
źródło