Saya memiliki variabel String (pada dasarnya kalimat bahasa Inggris dengan jumlah angka yang tidak ditentukan) dan saya ingin mengekstrak semua angka ke dalam array bilangan bulat. Saya bertanya-tanya apakah ada solusi cepat dengan ekspresi reguler?
Saya menggunakan solusi Sean dan mengubahnya sedikit:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Jawaban:
... mencetak
-2
dan12
.-? cocok dengan tanda negatif utama - secara opsional. \ d cocok dengan digit, dan kita perlu menulis
\
seperti\\
dalam String Java. Jadi, \ d + cocok dengan 1 digit atau lebih.sumber
2,000
. Untuk penggunaan seperti itu-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
seharusnya berfungsi.Bagaimana menggunakan
replaceAll
metode java.lang.String:Keluaran:
Deskripsi
[
dan]
membatasi sekumpulan karakter menjadi satu pencocokan, yaitu, hanya satu kali dalam urutan apa pun^
Pengenal khusus yang digunakan di awal kumpulan, digunakan untuk menunjukkan agar cocok dengan semua karakter yang tidak ada dalam kumpulan yang dipisahkan, alih-alih semua karakter yang ada di kumpulan.+
Antara satu dan waktu tak terbatas, sebanyak mungkin, memberi kembali sesuai kebutuhan-?
Salah satu karakter “-” dan “?”0-9
Karakter dalam rentang antara "0" dan "9"sumber
-
dengan sendirinya sebagai angka, bersama dengan hal-hal seperti9-
,---6
, dan1-2-3
.Anda sebenarnya dapat mengganti [0-9] dengan \ d, tetapi itu melibatkan pelolosan garis miring terbalik ganda, yang membuatnya lebih sulit untuk dibaca.
sumber
Ini untuk mengekstraksi angka yang mempertahankan desimal
sumber
Jawaban yang diterima mendeteksi angka tetapi tidak mendeteksi angka yang diformat, misalnya 2.000, atau desimal, misalnya 4.8. Untuk penggunaan seperti itu
-?\\d+(,\\d+)*?\\.?\\d+?
:Keluaran:
[4.8, 2,000]
sumber
(?:\.\d+)?
)untuk bilangan rasional gunakan yang ini:
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
sumber
Menggunakan Java 8, Anda dapat melakukan:
Jika Anda tidak memiliki angka negatif, Anda dapat menyingkirkan
replaceAll
(dan penggunaan!s.isEmpty()
difilter
), karena itu hanya untuk sesuatu yang benar perpecahan seperti2-34
(ini juga bisa ditangani murni dengan regex displit
, tapi itu cukup rumit).Arrays.stream
mengubah kamiString[]
menjadiStream<String>
.filter
menghilangkan string kosong di depan dan di belakangnya serta-
yang bukan bagian dari angka.mapToInt(Integer::parseInt).toArray()
memanggilparseInt
masingString
- masing untuk memberi kamiint[]
.Atau, Java 9 memiliki metode Matcher.results , yang memungkinkan sesuatu seperti:
Seperti berdiri, tidak satu pun dari ini merupakan peningkatan besar dari hanya mengulang hasil dengan
Pattern
/Matcher
seperti yang ditunjukkan pada jawaban lain, tetapi harus lebih sederhana jika Anda ingin menindaklanjutinya dengan operasi yang lebih kompleks yang secara signifikan disederhanakan dengan penggunaan aliran.sumber
Ekstrak semua bilangan real menggunakan ini.
sumber
Pecahan dan pengelompokan karakter untuk mewakili bilangan real mungkin berbeda antar bahasa. Bilangan real yang sama dapat ditulis dengan cara yang sangat berbeda tergantung pada bahasanya.
Angka dua juta di Jerman
2.000.000,00
dan dalam bahasa Inggris
2.000.000,00
Sebuah metode untuk sepenuhnya mengekstrak bilangan real dari string yang diberikan dengan cara tanpa bahasa:
sumber
Jika Anda ingin mengecualikan angka yang ada dalam kata, seperti bar1 atau aa1bb, tambahkan batas kata \ b ke jawaban berbasis ekspresi reguler. Sebagai contoh:
menampilkan:
sumber
Saya akan menyarankan untuk memeriksa nilai ASCII untuk mengekstrak angka dari String Misalkan Anda memiliki String input sebagai myname12345 dan jika Anda ingin mengekstrak angka 12345 Anda dapat melakukannya dengan terlebih dahulu mengubah String menjadi Array Karakter kemudian gunakan pseudocode berikut
setelah nomor diekstraksi tambahkan ke array
Semoga ini membantu
sumber
Saya menemukan ungkapan ini paling sederhana
sumber
mengekstrak hanya angka dari string
sumber