Jeśli mam taki ciąg:
FOO[BAR]
Potrzebuję ogólnego sposobu, aby uzyskać ciąg „BAR” z ciągu, tak aby bez względu na to, jaki ciąg znajduje się między nawiasami kwadratowymi, byłby w stanie uzyskać ciąg.
na przykład
FOO[DOG] = DOG
FOO[CAT] = CAT
Powinieneś móc używać niechciwych kwantyfikatorów, a konkretnie * ?. Prawdopodobnie będziesz potrzebować następujących rzeczy:
Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");
To da ci wzór, który będzie pasował do twojego ciągu i umieści tekst w nawiasach kwadratowych w pierwszej grupie. Zapoznaj się z dokumentacją Pattern API, aby uzyskać więcej informacji.
Aby wyodrębnić ciąg, możesz użyć czegoś takiego:
Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
String s = m.group(1);
// s now contains "BAR"
}
sposób bez wyrażeń regularnych:
alternatywnie, dla nieco lepszej wydajności / wykorzystania pamięci (dzięki Hosam):
źródło
lastIndexOf(']')
zamiast, który będzie obsługiwać nawiasów zagnieżdżonych. Ponadto uważam, że użycie programuindexOf(char)
byłoby szybsze niżindexOf(String)
.lastIndexOf
z pewnością szybciej będzie znaleźć nawias zamykający.Oto działający przykład:
RegexpExample.java
To pokazuje :
źródło
źródło
Jeśli po prostu potrzebujesz zdobyć to, co jest pomiędzy
[]
, możesz użyć w\[([^\]]*)\]
następujący sposób:Jeśli chcesz, aby był w formie
identifier + [ + content + ]
, możesz ograniczyć wyodrębnianie treści tylko wtedy, gdy identyfikator jest alfanumeryczny:Pozwoli to zweryfikować takie rzeczy
Foo [Bar]
, albomyDevice_123["input"]
na przykład.Główna kwestia
Główny problem występuje, gdy chcesz wyodrębnić zawartość czegoś takiego:
Regex nie będzie działać i wróci
BAR[CAT[123
iFOO
.Jeśli zmienimy Regex na,
\[(.*)\]
wszystko jest w porządku, ale jeśli próbujesz wyodrębnić zawartość z bardziej złożonych rzeczy, takich jak:Żaden z Regexów nie zadziała.
Najdokładniejszy Regex do wyodrębnienia właściwej treści we wszystkich przypadkach byłby znacznie bardziej złożony, ponieważ musiałby zrównoważyć
[]
pary i zapewnić ich zawartość.Prostsze rozwiązanie
Jeśli twoje problemy stają się coraz bardziej złożone, a zawartość jest
[]
arbitralna, możesz zamiast tego zrównoważyć pary[]
i wyodrębnić ciąg przy użyciu zwykłego starego kodu zamiast Regex:To jest bardziej pseudokod niż prawdziwy kod, nie jestem koderem Java, więc nie wiem, czy składnia jest poprawna, ale powinno być wystarczająco łatwe do ulepszenia.
Liczy się to, że ten kod powinien działać i pozwalać na wyodrębnienie zawartości
[]
, jakkolwiek jest to skomplikowane.źródło
Myślę, że twoje wyrażenie regularne wyglądałoby tak:
Zakładając, że inspektor obsługi lotów będzie stały.
Tak więc, aby umieścić to w Javie:
źródło
To zwróci wartość między pierwszym „[” a ostatnim „]”
Foo [Bar] => Bar
Foo [Bar [test]] => Bar [test]
Uwaga: należy dodać funkcję sprawdzania błędów, jeśli ciąg wejściowy nie jest poprawnie sformułowany.
źródło
zakładając, że żaden inny zamykający nawias kwadratowy nie jest dozwolony w obrębie, / FOO \ [([^ \]] *) \] /
źródło
Zdefiniowałbym, że chcę mieć maksymalną liczbę znaków innych niż] między
[
a]
. Muszą być one poprzedzone odwrotnym ukośnikiem (aw Javie trzeba je ponownie zmienić), a definicja non-] jest klasą znaków, a więc wewnątrz[
i]
(tj[^\\]]
.). Wynik:źródło
W ten sposób jego praca, jeśli chcesz przeanalizować jakiś ciąg, który pochodzi z mYearInDB.toString () = [2013], da 2013
źródło
To wyrażenie regularne działa dla mnie:
przykład:
wynik:
Przetestowano na http://rubular.com/
źródło
Spowoduje to zwrócenie łańcucha zawierającego tylko ciąg w nawiasach kwadratowych.
Spowoduje to usunięcie całego ciągu na zewnątrz z nawiasów kwadratowych.
Możesz przetestować ten przykładowy kod java online: http://tpcg.io/wZoFu0
Możesz przetestować to wyrażenie regularne tutaj: https://regex101.com/r/oUAzsS/1
źródło