Niestety, pomimo tego, że próbowałem nauczyć się regexów przynajmniej raz w roku przez tyle lat, ile pamiętam, zawsze zapominam, ponieważ używam ich tak rzadko. W tym roku moim noworocznym postanowieniem jest nie próbować ponownie uczyć się regex - więc w tym roku, aby uchronić mnie przed łzami, przekażę to Stack Overflow . (Remiks na ostatnie święta).
Chcę przekazać ciąg w tym formacie {getThis}
i otrzymać ciąg getThis
. Czy ktoś mógłby pomóc w dotrzymaniu mojego postanowienia noworocznego?
Powiązane pytania dotyczące przepełnienia stosu:
javascript
regex
ChrisInCambo
źródło
źródło
Odpowiedzi:
Jeśli twój ciąg zawsze będzie w tym formacie, wyrażenie regularne jest przesadą:
substring(1
oznacza rozpoczęcie jednego znaku (tuż za pierwszym{
) i,g.length-1)
oznacza zabranie znaków do (ale bez uwzględnienia) znaku o długości łańcucha minus jeden. To działa, ponieważ pozycja jest liczona od zera, tj.g.length-1
Jest ostatnią pozycją.Dla czytelników innych niż oryginalny plakat: jeśli ma to być wyrażenie regularne, użyj,
/{([^}]*)}/
jeśli chcesz zezwolić na puste ciągi lub/{([^}]+)}/
jeśli chcesz dopasować tylko wtedy, gdy między nawiasami klamrowymi znajduje się co najmniej jeden znak. Awaria:/
: uruchom wzorzec wyrażenia regularnego{
: dosłowny nawias klamrowy(
: rozpocznij przechwytywanie[
: zacznij definiować klasę znaków do przechwycenia^}
: „cokolwiek innego niż}
”]
: OK, to cała nasza definicja klasy*
: dowolna liczba znaków pasujących do właśnie zdefiniowanej klasy)
: gotowe przechwytywanie}
: dosłowny nawias klamrowy musi natychmiast następować po tym, co uchwyciliśmy/
: kończy wzorzec wyrażenia regularnegoźródło
Próbować
Oznacza to, że dopasuj dowolny znak między {i}, ale nie bądź chciwy - dopasuj najkrótszy ciąg kończący się na} (znak? Przestaje * być chciwy). Nawiasy pozwalają wyodrębnić dopasowaną część.
Byłby inny sposób
To pasuje do każdego znaku z wyjątkiem} char (inny sposób, aby nie być chciwym)
źródło
g
na końcu powoduje, że jest to wyszukiwanie globalne. Zobacz działający przykładźródło
Spróbuj tego:
Na przykład
powróci
gskinner.com
,ssd.sd
.źródło
\}
w pierwszym bloku?}
, nawet jeśli nie zaczyna się na{
.Oto proste rozwiązanie wykorzystujące zamianę javascript
Jak wskazuje zaakceptowana odpowiedź powyżej, pierwotny problem można łatwo rozwiązać za pomocą podciągu, ale użycie zamiany może rozwiązać bardziej skomplikowane przypadki użycia
Jeśli masz ciąg typu „randomstring999 [nazwa pola]”, używasz nieco innego wzorca, aby uzyskać nazwę pola
źródło
Ten działa w Textmate i pasuje do wszystkiego w pliku CSS między nawiasami klamrowymi.
selector {. . matches here including white space. . .}
Jeśli chcesz mieć możliwość zwrócenia zawartości, zawiń ją w jeszcze jeden zestaw nawiasów, jak na przykład:
i możesz uzyskać dostęp do zawartości za pośrednictwem $ 1.
Działa to również w przypadku funkcji, ale nie testowałem tego z zagnieżdżonymi nawiasami klamrowymi.
źródło
Chcesz używać wyrażeń regularnych lookahead i lookbehind. To da ci tylko to, co jest w nawiasach klamrowych:
źródło
Spróbuj tego
źródło
Regex do pobierania tablic ciągów z nawiasami klamrowymi występuje w ciągu znaków, a nie tylko do znajdowania pierwszego wystąpienia.
źródło
przyjrzałem się innym odpowiedziom i wydaje się, że brakuje w nich istotnej logiki. tzn. zaznacz wszystko pomiędzy dwoma KOLEJNYMI nawiasami, ale NIE nawiasy
więc oto moja odpowiedź
źródło
Prościej
.replace(/.*{(.*)}.*/, '$1')
niestety zwraca cały ciąg, jeśli wyrażenie regularne nie pasuje. Powyższy fragment kodu może łatwiej wykryć dopasowanie.źródło
Spróbuj tego, zgodnie z http://www.regextester.com działa normalnie dla js .
([^{]*?)(?=\})
źródło
/([^{]*?)\w(?=\})/gmi
Możesz użyć tej rekurencji wyrażenia regularnego, aby dopasować wszystko między, a nawet inne
{}
(np. Tekst JSON):źródło
Nawet to pomaga mi w rozwiązywaniu czyjegoś problemu,
Na przykład:
Wynik:
źródło