Jak podzielić ciąg z wieloma separatorami w JavaScript? Próbuję dzielić na przecinki i spacje, ale AFAIK, funkcja podziału JS obsługuje tylko jeden separator.
javascript
regex
split
mikemaccana
źródło
źródło
Odpowiedzi:
Przekaż wyrażenie regularne jako parametr:
Edytowano, aby dodać:
Możesz uzyskać ostatni element, wybierając długość tablicy minus 1:
... a jeśli wzór nie pasuje:
źródło
(hello world)|\|
które jeszcze nie do końca działały. Jakieś pomysły?Możesz przekazać wyrażenie regularne do operatora podziału JavaScript . Na przykład:
Lub jeśli chcesz zezwolić, aby wiele separatorów działało jako jeden:
(Musisz użyć nie przechwytujących parens (? :), ponieważ w przeciwnym razie zostanie ono ponownie połączone w wynik. Możesz też być mądry jak Aaron i użyć klasy postaci.)
(Przykłady przetestowane w Safari + FF)
źródło
|
jak pokazuje Jesse.Inną prostą, ale skuteczną metodą jest wielokrotne używanie funkcji split + join.
Zasadniczo dokonanie podziału, po którym następuje łączenie, jest jak zamiana globalna, więc zastępuje każdy separator przecinkiem, a po zastąpieniu wszystkich dokonuje ostatecznego podziału przecinkiem
Wynikiem powyższego wyrażenia jest:
Rozwijając to, możesz również umieścić go w funkcji:
Stosowanie:
Jeśli często korzystasz z tej funkcji, może warto rozważyć owijanie
String.prototype.split
dla wygody (myślę, że moja funkcja jest dość bezpieczna - jedyne, co należy wziąć pod uwagę, to dodatkowe obciążenie warunków warunkowych (niewielkie) i fakt, że brakuje implementacji argumentu limitu jeśli tablica zostanie przekazana).Pamiętaj, aby dołączyć tę
splitMulti
funkcję, jeśli używasz tego podejścia do poniższego opisu po prostu ją otacza :). Warto również zauważyć, że niektórzy ludzie marszczą brwi przy rozszerzaniu wbudowanych (ponieważ wiele osób robi to źle i mogą wystąpić konflikty), więc w razie wątpliwości porozmawiaj z kimś starszym przed użyciem tego lub zapytaj na SO :)Stosowanie:
Cieszyć się!
źródło
for(var i = 0; i < tokens.length; i++)
a niefor(var i = 1; i < tokens.length; i++)
?tokens[1]
od zapisania jednej iteracji,tokens[0] == tempchar
atempchar
potokens
zakończeniu iteracji podzieliliśmy się, aby zakończyć. Zaktualizuję odpowiedź odpowiednio dzięki @tic :).Uprośćmy: (dodanie „[] +” do RegEx oznacza „1 lub więcej”)
Oznacza to, że „+” i „{1,}” są takie same.
źródło
Podstępna metoda:
źródło
:/
'('
za/(/g
wymienić wszystkie(
elementy -g
jest globalna flaga dla RegExp - więc szukać wszystkich wystąpień(
nie pierwszaDla tych z Was, którzy chcą większej personalizacji funkcji dzielenia, napisałem algorytm rekurencyjny, który dzieli dany ciąg z listą znaków do podziału. Napisałem to zanim zobaczyłem powyższy post. Mam nadzieję, że pomoże to niektórym sfrustrowanym programistom.
Powyższy przykład zwraca:
["people", "and", "other", "things"]
Uwaga:
flatten
funkcja została zaczerpnięta z kodu Rosettaźródło
Możesz po prostu połączyć wszystkie znaki, których chcesz użyć jako separatory, pojedynczo lub zbiorowo, w wyrażenie regularne i przekazać je do funkcji podziału. Na przykład możesz napisać:
Wyjście będzie:
źródło
Być może powinieneś zrobić coś w rodzaju zamiany łańcucha, aby zamienić jeden separator na drugi, tak abyś miał tylko jeden separator, który poradziłby sobie w podziale.
źródło
Cześć, na przykład, jeśli podzieliłeś i zastąpiłeś w Ciąg 07:05:45
Wynik
źródło
Oto nowy sposób na osiągnięcie tego samego w ES6 :
Uwaga w tej funkcji:
source
Wynikiem powyższego kodu będzie:
źródło
to zwróci ciąg bez specjalnego cewnika.
źródło
Mój refaktor @Brian odpowiedzi
źródło
Uważam, że jednym z głównych powodów, dla których potrzebuję tego, jest podzielenie ścieżek plików zarówno na, jak
/
i na\
. To trochę trudne wyrażenie, więc opublikuję to tutaj w celach informacyjnych:źródło
Myślę, że łatwiej jest określić, co chcesz zostawić, niż to, co chcesz usunąć.
Jeśli chcesz mieć tylko angielskie słowa, możesz użyć czegoś takiego:
Przykłady (fragment kodu):
źródło
Począwszy od rozwiązania @ stephen-sweriduk (to było dla mnie bardziej interesujące!), Nieco zmodyfikowałem go, aby stał się bardziej ogólny i wielokrotnego użytku:
i wtedy
który zwraca jako oryginał:
źródło
Pokaż fragment kodu
źródło
Zapewnię klasyczną implementację takiej funkcji. Kod działa w prawie wszystkich wersjach JavaScript i jest w pewien sposób optymalny.
Po prostu czysty kod:
Możesz zobaczyć kod działający na placu zabaw: https://codeguppy.com/code.html?IJI0E4OGnkyTZnoszAzf
źródło
Nie znam wydajności RegEx, ale tutaj jest kolejna alternatywa dla RegEx wykorzystuje natywny HashSet i działa zamiast tego w złożoności O (max (str. Długość, delimeter.length)):
źródło
Nie najlepszy sposób, ale działa w przypadku podziału z wieloma separatorami / separatorami
HTML
javascript
źródło
Korzystam z wyrażenia regularnego:
źródło