W moim kodzie dzielę ciąg na podstawie _
drugiego elementu tablicy i chwytam go.
var element = $(this).attr('class');
var field = element.split('_')[1];
Bierze good_luck
i zapewnia mi luck
. Działa świetnie!
Ale teraz mam klasę, która wygląda good_luck_buddy
. Jak sprawić, by mój skrypt javascript zignorował drugą _
i dał mi luck_buddy
?
Znalazłem to var field = element.split(new char [] {'_'}, 2);
w odpowiedzi ac # stackoverflow, ale to nie działa. Próbowałem tego w jsFiddle ...
źródło
_
dopasowuje się do grupy przechwytywania i z tego powodu zostaje dodane do listy tokenów."Aspect Ratio: 16:9".split(/:(.+)/)
out:["Aspect Ratio", " 16:9", ""]
": 16:9"
, po separatorze nie ma nic, co tworzy pusty łańcuch na końcu.Do czego potrzebujesz wyrażeń regularnych i tablic?
źródło
_
, pisząc:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
wszystkie części:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Tam masz. Również ze wsparciem zmiennej igłyZa wszelką cenę unikam RegExp. Oto kolejna rzecz, którą możesz zrobić:
źródło
Zamień pierwszą instancję na unikalny symbol zastępczy, a następnie podziel stamtąd.
Jest to bardziej przydatne, gdy potrzebne są obie strony podziału.
źródło
Możesz użyć wyrażenia regularnego, takiego jak:
Możesz użyć drugiego parametru, który określa limit podziału. tj .: var field = element.split ('_', 1) [1];źródło
'good_luck_buddy'.split('_', 1);
wraca właśnie['good']
(:?.*)
miała to być grupa, która nie mogła schwytać? Jeśli tak, to powinno być(?:.*)
, ale jeśli to poprawisz, przekonasz się, że to już nie działa.(:?.*)
dopasowuje opcjonalny,:
po którym następuje zero lub więcej dowolnych znaków. To rozwiązanie działa z tego samego powodu, co robi @ MarkF: wszystko po pierwszym_
jest dodawane do listy tokenów, ponieważ zostało dopasowane do grupy przechwytywania. (Ponadtog
modyfikator nie działa, gdy jest stosowany w wyrażeniu regularnym podzielonym.)W dzisiejszych czasach
String.prototype.split
rzeczywiście pozwala ograniczyć liczbę podziałów.zastrzeżenie
To może nie działać w oczekiwany sposób. Miałem nadzieję, że po prostu zignoruje resztę ograniczników, ale zamiast tego, gdy osiągnie limit, ponownie dzieli pozostały ciąg, pomijając część po podziale z wyników zwracanych.
Miałem nadzieję na:
źródło
To rozwiązanie działało dla mnie
LUB
źródło
Javascript
String.split
niestety nie ma możliwości ograniczenia rzeczywistej liczby podziałów. Ma drugi argument, który określa liczbę rzeczywistych podzielonych elementów, co nie jest przydatne w twoim przypadku. Rozwiązaniem byłoby podzielenie łańcucha, przesunięcie pierwszego elementu, a następnie ponowne dołączenie do pozostałych elementów:źródło
Potrzebuję dwóch części łańcucha, więc wyrażenie regularne wygląda, jakby mi w tym pomogło.
źródło
Przy pomocy przydziału destrukcyjnego może być bardziej czytelny:
źródło
Najszybsze rozwiązanie?
Przeprowadziłem kilka testów porównawczych , a to rozwiązanie odniosło ogromny sukces: 1
Porównanie wydajności z innymi rozwiązaniami
Jedynym konkurentem był ten sam wiersz kodu, z wyjątkiem użycia
substr
zamiastslice
.Inne rozwiązania próbowałem udziałem
split
lubRegExp
s wziął duży spadek wydajności i były o 2 rzędy wielkości wolniejsze. Korzystaniejoin
z wynikówsplit
oczywiście dodaje dodatkową utratę wydajności.Dlaczego są wolniejsze? Za każdym razem, gdy trzeba utworzyć nowy obiekt lub tablicę, JS musi zażądać części pamięci od systemu operacyjnego. Ten proces jest bardzo wolny.
Oto kilka ogólnych wskazówek na wypadek, gdy ścigasz testy porównawcze:
{}
lub tablic[]
(takich jak te, któresplit
tworzą) będą dużo kosztować wydajność.RegExp
wyszukiwanie jest bardziej skomplikowane, a zatem wolniejsze niż wyszukiwanie ciągów.Usuwanie poza pierwszą instancją
Oto rozwiązanie, które podzieli na n-tą instancję włącznie. To nie jest tak szybkie, ale na pytanie PO,
gobble(element, '_', 1)
jest wciąż> 2x szybsze niż rozwiązanieRegExp
lubsplit
i może zrobić więcej:Przy powyższej definicji
gobble('path/to/file.txt', '/')
podałby nazwę pliku igobble('prefix_category_item', '_', 1)
usunąłby przedrostek jak pierwsze rozwiązanie w tej odpowiedzi.źródło
Rozwiązanie Marka F jest niesamowite, ale nie jest obsługiwane przez stare przeglądarki. Rozwiązanie Kennebec jest niesamowite i obsługiwane przez stare przeglądarki, ale nie obsługuje wyrażenia regularnego.
Tak więc, jeśli szukasz rozwiązania, które dzieli łańcuch tylko raz, które jest obsługiwane przez stare przeglądarki i obsługuje wyrażenie regularne, oto moje rozwiązanie:
źródło
Dla początkujących, takich jak ja, którzy nie są przyzwyczajeni do wyrażeń regularnych, zadziałało to rozwiązanie obejścia:
Metoda slice () wyodrębnia część ciągu i zwraca nowy ciąg, a metoda indexOf () zwraca pozycję pierwszego znalezionego wystąpienia określonej wartości w ciągu.
źródło
Użyj
replace()
metody string z wyrażeniem regularnym :Ten wyrażenie regularne dopasowuje 0 lub więcej znaków przed pierwszym
_
i samym_
sobą. Dopasowanie zostanie następnie zastąpione pustym ciągiem.źródło
document.body.innerHTML
część jest całkowicie bezużyteczna.document.body.innerHTML
?document.body
zależy od modelu DOM, który będzie obecny i nie będzie działał w czystym środowisku JavaScript.console.log
wystarczy do tego celu lub po prostu pozostaw wynik w zmiennej do kontroli.To działało dla mnie w Chrome + FF:
Jeśli potrzebujesz również klucza, spróbuj:
źródło
Oto jeden RegExp, który załatwia sprawę.
Najpierw wymusza rozpoczęcie meczu od początku z „^”. Następnie dopasowuje dowolną liczbę znaków, które nie są „_”, innymi słowy wszystkie znaki przed pierwszym „_”.
„?” oznacza minimalną liczbę znaków, które sprawiają, że cały wzór jest dopasowany, do znaku „. *?” ponieważ po nim następuje „_”, który jest następnie uwzględniany w dopasowaniu jako jego ostatni znak.
Dlatego ten split () używa takiej pasującej części jak „rozdzielacz” i usuwa go z wyników. Usuwa więc wszystko do pierwszego „_” włącznie, a resztę stanowi drugi element wyniku. Pierwszym elementem jest „” reprezentujący część przed dopasowaną częścią. Jest to „”, ponieważ mecz zaczyna się od początku.
Istnieją inne RegExpy, które działają równie dobrze jak /_(.*)/ podane przez Chandu w poprzedniej odpowiedzi.
Zaletą /^.*?_/ jest to, że możesz zrozumieć, co robi bez konieczności posiadania wiedzy na temat specjalnej roli, jaką grupy przechwytują w funkcji replace ().
źródło