Periksa apakah String berisi angka Java


102

Saya sedang menulis program di mana pengguna memasukkan String dalam format berikut:

"What is the square of 10?"
  1. Saya perlu memeriksa apakah ada nomor di String
  2. lalu ekstrak angkanya saja.
  3. Jika saya menggunakan .contains("\\d+")atau .contains("[0-9]+"), program tidak dapat menemukan nomor di String, tidak peduli apa inputnya, tetapi .matches("\\d+")hanya akan berfungsi jika hanya ada angka.

Apa yang dapat saya gunakan sebagai solusi untuk menemukan dan mengekstrak?


Jika Anda ingin mengekstrak angka pertama, bukan hanya digit dari string input, lihat jawaban saya.
Sajal Dutta

Jawaban:


230

coba ini

str.matches(".*\\d.*");

2
apa fungsi garis miring terbalik ganda?
ankit

15
Untuk menjelaskan:. * Berarti karakter apa pun dari 0 hingga kejadian tak terbatas, daripada \\ d + (garis miring terbalik ganda menurut saya hanya untuk menghindari garis miring terbalik kedua) dan \ d + berarti digit dari 1 waktu hingga tak terbatas.
Giudark

6
Ini bukan sihir alien, itu BS rahasia, kembali dari hari-hari ketika tidak ada yang bisa melakukan hal ini kecuali para insinyur yang menemukannya karena pada dasarnya itu adalah kode rahasia yang hanya diketahui pembuatnya sampai mereka membagikannya.
JamisonMan111

Dimodifikasi, karena jika hanya ada satu digit, solusi sudah cukup baik, tidak perlu 1 digit atau lebih dalam hal ini.
Yassin Hajaj

26

Jika Anda ingin mengekstrak angka pertama dari string input, Anda dapat melakukan-

public static String extractNumber(final String str) {                
    
    if(str == null || str.isEmpty()) return "";
    
    StringBuilder sb = new StringBuilder();
    boolean found = false;
    for(char c : str.toCharArray()){
        if(Character.isDigit(c)){
            sb.append(c);
            found = true;
        } else if(found){
            // If we already found a digit before and this char is not a digit, stop looping
            break;                
        }
    }
    
    return sb.toString();
}

Contoh:

Untuk masukan "123abc", metode di atas akan mengembalikan 123.

Untuk "abc1000def", 1000.

Untuk "555abc45", 555.

Untuk "abc", akan mengembalikan string kosong.


11

Saya pikir ini lebih cepat dari regex.

public final boolean containsDigit(String s) {
    boolean containsDigit = false;

    if (s != null && !s.isEmpty()) {
        for (char c : s.toCharArray()) {
            if (containsDigit = Character.isDigit(c)) {
                break;
            }
        }
    }

    return containsDigit;
}

Maaf saya tidak melihat ekstraksi. Jika Anda ingin mengekstrak nomor dalam string, Anda dapat dengan mudah mengedit kode ini.
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") menggantikan semua huruf

s=s.replaceAll("[*0-9]", "") menggantikan semua angka

jika Anda melakukan di atas dua penggantian, Anda akan mendapatkan semua string berkarakter khusus

Jika Anda ingin mengekstrak hanya bilangan bulat dari a String s=s.replaceAll("[^0-9]", "")

Jika Anda hanya ingin mengekstrak Abjad dari file String s=s.replaceAll("[^a-zA-Z]", "")

Selamat coding :)


10

Saya tidak dapat menemukan satu pola pun yang benar. Silakan ikuti panduan di bawah ini untuk solusi kecil dan manis.

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();

Ini bekerja dengan sangat baik. Satu-satunya hal yang perlu Anda perhatikan adalah jika string berisi garis miring ke belakang. Jika ya, maka saya pikir ini akan menghasilkan kesalahan "karakter melarikan diri ilegal".
w3bshark

ini yang terbaik
Yashwin Munsadwala

9

Kode di bawah ini cukup untuk "Periksa apakah String berisi angka di Java"

Pattern p = Pattern.compile("([0-9])");
Matcher m = p.matcher("Here is ur string");

if(m.find()){
    System.out.println("Hello "+m.find());
}

8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);

3
Baris pertama memiliki kesalahan kecil, tanda kurung tidak ada di String. Pola p = Pola.kompilasi ("(([AZ]. * [0-9]))");
Gaurav Tyagi

juga, ini tidak berhasil ... pengujian berfungsi, tetapi 123TEST tidak akan berfungsi.
fergal_dd

7

Coba pola berikut:

.matches("[a-zA-Z ]*\\d+.*")

Namun jika pengguna sopan dan mengatakan "please"ini akan gagal. Ditambah dalam contoh OP, ada "?" untuk menjelaskan.
Christopher

1
Anda yakin sudah memperbaikinya?
Christopher

Ekspresi ini tidak berfungsi untuk jawaban seperti "10"sampel.
fabdouglas

6

Solusi yang saya gunakan terlihat seperti ini:

Pattern numberPat = Pattern.compile("\\d+");
Matcher matcher1 = numberPat.matcher(line);

Pattern stringPat = Pattern.compile("What is the square of", Pattern.CASE_INSENSITIVE);
Matcher matcher2 = stringPat.matcher(line);

if (matcher1.find() && matcher2.find())
{
    int number = Integer.parseInt(matcher1.group());                    
    pw.println(number + " squared = " + (number * number));
}

Saya yakin ini bukan solusi yang tepat, tetapi sesuai dengan kebutuhan saya. Terima kasih atas bantuannya. :)


1

Anda bisa mencobanya

String text = "ddd123.0114cc";
    String numOnly = text.replaceAll("\\p{Alpha}","");
    try {
        double numVal = Double.valueOf(numOnly);
        System.out.println(text +" contains numbers");
    } catch (NumberFormatException e){
        System.out.println(text+" not contains numbers");
    }     

1

Karena Anda tidak hanya ingin mencari angka tetapi juga mengekstraknya, Anda harus menulis fungsi kecil yang melakukannya untuk Anda. Lakukan huruf demi huruf sampai Anda menemukan satu digit. Ah, baru saja menemukan kode yang diperlukan untuk Anda di stackoverflow: temukan integer dalam string . Lihat jawaban yang diterima.


1
public String hasNums(String str) {
        char[] nums = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] toChar = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            toChar[i] = str.charAt(i);
            for (int j = 0; j < nums.length; j++) {
                if (toChar[i] == nums[j]) { return str; }
            }
        }
        return "None";
    }

1

.matches(".*\\d+.*")hanya berfungsi untuk angka tetapi tidak untuk simbol lain seperti //atau *dll.


0

ASCII ada di awal UNICODE, jadi Anda dapat melakukan sesuatu seperti ini:

(x >= 97 && x <= 122) || (x >= 65 && x <= 90) // 97 == 'a' and 65 = 'A'

Saya yakin Anda bisa mengetahui nilai-nilai lainnya ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.