Bir Dizenin Java sayıları içerip içermediğini kontrol edin


102

Kullanıcının aşağıdaki formatta bir String girdiği bir program yazıyorum:

"What is the square of 10?"
  1. Dizide bir sayı olup olmadığını kontrol etmem gerekiyor
  2. ve sonra sadece sayıyı çıkarın.
  3. .contains("\\d+")Veya kullanırsam .contains("[0-9]+"), giriş ne olursa olsun program String'de bir sayı bulamaz, ancak .matches("\\d+")yalnızca sayılar olduğunda çalışacaktır.

Bulmak ve çıkarmak için bir çözüm olarak ne kullanabilirim?


Yalnızca giriş dizesindeki rakamı değil, ilk sayıyı çıkarmak istiyorsanız, cevabıma bakın.
Sajal Dutta

Yanıtlar:


232

bunu dene

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

2
çift ​​ters eğik çizgi ne işe yarar?
ankit

16
Açıklamak gerekirse:. *, 0'dan sonsuza kadar herhangi bir karakter anlamına gelir, \\ d + (sanırım çift ters eğik çizgi sadece ikinci ters eğik çizgiden kaçmak içindir) ve \ d +, 1'den sonsuza kadar bir rakam anlamına gelir.
Giudark

6
Bu uzaylı büyüsü değil, şifreli BS, kimsenin bunu yapamadığı günlerden beri, onu icat eden mühendisler, çünkü temelde sadece yaratıcıların paylaşana kadar bildiği gizli bir kod.
JamisonMan111

Değiştirildi, çünkü sadece bir rakam mevcutsa çözüm yeterince iyidir, bu durumda 1 veya daha fazla rakama sahip olmaya gerek yoktur.
Yassin Hajaj

27

Giriş dizesinden ilk sayıyı çıkarmak istiyorsanız, şunları yapabilirsiniz:

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();
}

Örnekler:

"123abc" girişi için, yukarıdaki yöntem 123'ü döndürecektir.

"Abc1000def" için 1000.

"555abc45" için, 555.

"Abc" için boş bir dize döndürür.


11

Bence regex'ten daha hızlı.

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;
}

Özür dilerim, ayıklamayı göremedim. Dizideki sayıyı çıkarmak istiyorsanız, bu kodu kolayca düzenleyebilirsiniz.
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") tüm alfabelerin yerini alır

s=s.replaceAll("[*0-9]", "") tüm rakamların yerini alır

Eğer yukarıda iki yer değiştirirseniz, tüm özel karakterli dizgeyi elde edersiniz

Yalnızca tamsayıları bir String s=s.replaceAll("[^0-9]", "")

Yalnızca Alfabeleri bir String s=s.replaceAll("[^a-zA-Z]", "")

Mutlu kodlamalar :)


10

Doğru tek bir model bulamadım. Küçük ve tatlı bir çözüm için lütfen aşağıdaki kılavuzu izleyin.

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

Bu gerçekten iyi çalışıyor. Dikkat etmeniz gereken tek şey, dizenin ters eğik çizgi içermesidir. Varsa, bunun bir "geçersiz kaçış karakteri" hatası üreteceğini düşünüyorum.
w3bshark

bu en iyisi
Yashwin Munsadwala

9

Aşağıdaki kod, "Bir Dizenin Java'da sayılar içerip içermediğini kontrol edin" için yeterlidir.

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
İlk satırda küçük hata var, String'de köşeli ayraç eksik. Desen p = Desen.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi

ayrıca, bu işe yaramaz ... test çalışır, ancak 123TEST çalışmaz.
fergal_dd

7

Aşağıdaki kalıbı deneyin:

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

Ancak, kullanıcı kibarsa ve bunun "please"başarısız olacağını söylüyorsa . Artı OP'nin örneğinde bir "?" hesaba katmak için.
christopher

1
Düzelttiğine emin misin?
christopher

Bu ifade gibi bir cevap için çalışmıyor "10" örneklem .
fabdouglas

6

Benim kullandığım çözüm şuna benziyor:

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));
}

Eminim mükemmel bir çözüm değildir, ancak ihtiyaçlarıma uygundur. Yardımlarınız için hepinize teşekkür ederim. :)


1

Bunu deneyebilirsin

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

Sadece bir sayı aramakla kalmayıp, aynı zamanda çıkarmak da istediğiniz için, bunu sizin için yapan küçük bir fonksiyon yazmalısınız. Bir rakam bulana kadar harf harf gidin. Ah, stackoverflow'da sizin için gerekli kodu buldum: string'de tamsayı bulun . Kabul edilen cevaba bakın.


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+.*")Sadece sayılar için çalışır ancak diğer değil semboller gibi //veya *vb


0

ASCII, UNICODE'un başlangıcındadır, bu nedenle şöyle bir şey yapabilirsiniz:

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

Eminim diğer değerleri bulabilirsin ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.