Mam zmienną typu String (w zasadzie zdanie angielskie z nieokreśloną liczbą liczb) i chciałbym wyodrębnić wszystkie liczby do tablicy liczb całkowitych. Zastanawiałem się, czy istnieje szybkie rozwiązanie z wyrażeniami regularnymi?
Użyłem rozwiązania Seana i nieznacznie je zmieniłem:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Odpowiedzi:
... wydruki
-2
i12
.-? dopasowuje wiodący znak minus - opcjonalnie. \ d dopasowuje cyfrę, ale musimy pisać
\
tak, jak\\
w Java String. Zatem \ d + dopasowuje 1 lub więcej cyfr.źródło
2,000
. Do takiego użytku-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
powinno działać.A co z
replaceAll
metodą java.lang.String:Wynik:
Opis
[
i]
ogranicza zestaw znaków do pojedynczego dopasowania, tj. tylko jeden raz w dowolnej kolejności^
Specjalny identyfikator używany na początku zestawu, służący do wskazania braku dopasowania wszystkich znaków występujące na wyznaczonym zestawie, zamiast przedstawić wszystkie znaki w zestawie.+
Od jednego do nieograniczonej liczby razy, tyle razy, ile to możliwe, oddając w razie potrzeby-?
Jeden ze znaków „-” i „?”0-9
Znak z zakresu od „0” do „9”źródło
-
samodzielnie jako liczba, wraz z rzeczy, jak9-
,---6
i1-2-3
.W rzeczywistości możesz zamienić [0-9] na \ d, ale wiąże się to ze znakami ucieczki z podwójnym ukośnikiem odwrotnym, co utrudnia odczytanie.
źródło
Służy do wyodrębniania liczb zachowujących ułamek dziesiętny
źródło
Zaakceptowana odpowiedź wykrywa cyfry, ale nie wykrywa liczb sformatowanych, np. 2000, ani miejsc po przecinku, np. 4.8. Do takiego zastosowania
-?\\d+(,\\d+)*?\\.?\\d+?
:Wynik:
[4.8, 2,000]
źródło
(?:\.\d+)?
.)dla liczb wymiernych użyj tego:
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
źródło
Używając Java 8, możesz:
Jeśli nie masz liczb ujemnych, możesz pozbyć się
replaceAll
(i użyć!s.isEmpty()
wfilter
), ponieważ służy to tylko do prawidłowego podziału czegoś podobnego2-34
(można to również załatwić wyłącznie za pomocą wyrażenia regularnego wsplit
, ale jest to dość skomplikowane).Arrays.stream
zamienia naszString[]
wStream<String>
.filter
usuwa początkowe i końcowe puste ciągi, a także te,-
które nie są częścią liczby.mapToInt(Integer::parseInt).toArray()
apelujeparseInt
do każdegoString
o przyznanie nam plikuint[]
.Alternatywnie Java 9 ma metodę Matcher.results , która powinna pozwolić na coś takiego:
W obecnym stanie żaden z nich nie jest dużym postępem w stosunku do zwykłego zapętlania wyników z
Pattern
/,Matcher
jak pokazano w innych odpowiedziach, ale powinno być prostsze, jeśli chcesz kontynuować z bardziej złożonymi operacjami, które są znacznie uproszczone przy użyciu strumienie.źródło
Wyodrębnij wszystkie liczby rzeczywiste za pomocą tego.
źródło
Znaki ułamkowe i grupujące reprezentujące liczby rzeczywiste mogą się różnić w zależności od języka. Ta sama liczba rzeczywista może być zapisana na bardzo różne sposoby, w zależności od języka.
Liczba dwa miliony w języku niemieckim
2 000 000,00
i po angielsku
2.000.000,00
Metoda pełnego wyodrębnienia liczb rzeczywistych z danego ciągu w sposób niezależny od języka:
źródło
Jeśli chcesz wykluczyć liczby zawarte w słowach, takie jak bar1 lub aa1bb, dodaj granice słów \ b do dowolnej odpowiedzi opartej na wyrażeniu regularnym. Na przykład:
wyświetlacze:
źródło
Sugerowałbym sprawdzenie wartości ASCII w celu wyodrębnienia liczb z łańcucha Przypuśćmy, że masz ciąg wejściowy jako moje imię12345 i jeśli chcesz po prostu wyodrębnić liczby 12345, możesz to zrobić najpierw konwertując ciąg na tablicę znaków, a następnie użyj następującego pseudokodu
po wyodrębnieniu liczb dołącz je do tablicy
Mam nadzieję że to pomoże
źródło
To wyrażenie było dla mnie najprostsze
źródło
wyodrębnia tylko liczby z łańcucha
źródło