2013-09-03 25 views
63

Piszę program, w którym użytkownik wprowadza ciąg w następującym formacie:Sprawdź, czy ciąg zawiera numery Java

"What is the square of 10?" 
  1. muszę sprawdzić, że istnieje pewna liczba w ciągu
  2. , a następnie wyodrębnij tylko liczbę.
  3. Jeśli korzystam z .contains("\\d+") lub .contains("[0-9]+"), program nie może znaleźć numeru w łańcuchu, bez względu na to, jakie wejście, ale .matches("\\d+") będzie działać tylko wtedy, gdy są tylko liczby.

Co mogę użyć jako rozwiązanie do wyszukiwania i wyodrębniania?

+0

Jeśli chcesz wyodrębnić pierwszy numer, a nie tylko cyfrę z wejściowego ciągu, zobacz moją odpowiedź. –

Odpowiedz

1

Roztwór poszedłem z wygląda następująco:

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

Jestem pewien, że nie jest to idealne rozwiązanie, ale nadaje się do moich potrzeb. Dziękuję wszystkim za pomoc.:)

4

Spróbuj następujący wzór:

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

Jeśli jednak użytkownik jest grzeczny i mówi "proszę", to się nie powiedzie. Dodatkowo w przykładzie OP jest "?" w celu uwzględnienia. – christopher

+0

Naprawiłem to. :) –

+1

Czy jesteś pewien, że to naprawiłeś? – christopher

143

spróbować

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

Te rzeczy są w zasadzie podobne do obcej magii –

+1

co robi podwójny ukośnik? – ankit

+10

Aby wytłumaczyć:. * Oznacza dowolną postać od 0 do nieskończonej obecności, niż \\ d + (podwójny ukośnik odwrotny, który myślę, że jest po prostu uciec z drugiego ukośnika odwrotnego) i \ d + oznacza cyfrę od 1 do nieskończoności. – Giudark

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

Pierwsza linia zawiera niewielki błąd, brak nawiasu w łańcuchu. Wzór p = Pattern.compile ("(([A-Z]. * [0-9])"); –

1

Można spróbować tej

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

Jak można nie tylko chcą szukać numer, ale także wyodrębnij go, powinieneś napisać mały fu nacje robiąc to dla ciebie. Idź list po literze, aż zauważysz cyfrę. Właśnie znalazłem potrzebny kod dla ciebie na stackoverflow: find integer in string. Spójrz na zaakceptowaną odpowiedź.

5

Myślę, że jest szybszy niż 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; 
} 
+0

Przykro mi, że nie widziałem ekstrakcji. Jeśli chcesz wyodrębnić liczbę w łańcuchu, możesz łatwo edytować ten kod. –

21

Jeśli chcesz wyodrębnić pierwszy numer wyjścia z ciągu wejściowego, można DO-

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

Przykłady:

Dla wejścia "123abc" metoda powyżej woli powrót 123.

Dla "abc1000def", 1000.

Dla "555abc45", 555.

Dla "abc" zwróci pusty ciąg znaków.

6

Poniższy kod jest na tyle „Sprawdź, czy ciąg zawiera numery w Javie”

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

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

s=s.replaceAll("[*a-zA-Z]", "") zastępuje wszystkie alfabety

s=s.replaceAll("[*0-9]", "") zastępuje wszystkie Liczby

jeśli nie powyżej dwóch zamienia, otrzymasz wszystkie specjalne łańcuch znaków

Jeśli chcesz wyodrębnić tylko liczby całkowite z String s=s.replaceAll("[^0-9]", "")

Jeśli chcesz, aby wyodrębnić tylko alfabetu od a String s=s.replaceAll("[^a-zA-Z]", "")

Szczęśliwy kodowania :)

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+.*") działa tylko dla liczb, ale nie innych symboli, takich jak // lub * itp

0

ASCII jest na początku UNICODE, więc możesz zrobić coś takiego:

(x> = 97 & & x < = 122) || (X> = 65 & & x < = 90)

// 97 == 'a' i 65 = 'A', jestem pewien, że można dowiedzieć się inne wartości ...

5

I nie można znaleźć prawidłowego pojedynczego wzorca. Proszę postępować zgodnie z poniższym przewodnikiem dla małego i słodkiego rozwiązania.

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

Działa to naprawdę dobrze. Jedyną rzeczą, na którą musisz uważać, jest to, czy ciąg zawiera ukośnik. Jeśli tak, to myślę, że spowoduje to błąd "nielegalnego znaku ucieczki". – w3bshark

Powiązane problemy