Проверить, содержит ли строка числа Java

102

Я пишу программу, в которой пользователь вводит строку в следующем формате:

"What is the square of 10?"
  1. Мне нужно проверить, есть ли число в строке
  2. а затем извлеките только число.
  3. Если я использую .contains("\\d+")или .contains("[0-9]+"), программа не может найти число в строке, независимо от того, какой вводится, но .matches("\\d+")будет работать только тогда, когда есть только числа.

Что я могу использовать в качестве решения для поиска и извлечения?

Дуэйн
источник
Если вы хотите извлечь первое число, а не только цифру из входной строки, см. Мой ответ.
Sajal Dutta

Ответы:

232

попробуй это

str.matches(".*\\d.*");
Евгений Дорофеев
источник
2
что делает двойной обратный слеш?
ankit
16
Чтобы объяснить:. * Означает любой символ от 0 до бесконечности, чем \\ d + (двойная обратная косая черта, я думаю, это просто чтобы избежать второй обратной косой черты), а \ d + означает цифру от 1 до бесконечности.
Giudark
6
Это не инопланетная магия, это загадочная чушь из тех времен, когда никто не мог делать это, кроме инженеров, которые изобрели его, потому что это в основном секретный код, который знают только создатели, пока они не поделятся им.
JamisonMan111
Изменено, потому что если присутствует только одна цифра, решение достаточно хорошее, в этом случае нет необходимости иметь 1 или более цифр.
Ясин Хаджадж
27

Если вы хотите извлечь первое число из входной строки, вы можете:

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

Примеры:

Для ввода «123abc» приведенный выше метод вернет 123.

Для «abc1000def» 1000.

Для «555abc45», 555.

Для «abc» вернет пустую строку.

Саджал Дутта
источник
11

Я думаю, что это быстрее, чем регулярное выражение.

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;
}
Мелих Алтынташ
источник
Извините, я не видел извлечения. Если вы хотите извлечь число в строке, вы можете легко отредактировать этот код.
Мелих Алтынташ
10

s=s.replaceAll("[*a-zA-Z]", "") заменяет все алфавиты

s=s.replaceAll("[*0-9]", "") заменяет все числа

если вы выполните более двух замен, вы получите всю строку со специальными символами

Если вы хотите извлечь только целые числа из String s=s.replaceAll("[^0-9]", "")

Если вы хотите извлечь только алфавиты из String s=s.replaceAll("[^a-zA-Z]", "")

Удачного кодирования :)

Малликарджуна Сангисетти
источник
10

Я не мог найти ни одного правильного шаблона. Пожалуйста, следуйте приведенному ниже руководству, чтобы найти небольшое и приятное решение.

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();
Ишаан
источник
Это действительно хорошо работает. Единственное, на что вам нужно обратить внимание, - это если строка содержит обратную косую черту. Если это так, то я думаю, это приведет к ошибке «недопустимый escape-символ».
w3bshark
это лучший
Яшвин Мунсадвала
9

Приведенного ниже кода достаточно для "Проверить, содержит ли строка числа в 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
В первой строке есть небольшая ошибка, в строке отсутствует скобка. Шаблон p = Pattern.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi
кроме того, это не работает ... тест работает, но 123TEST не работает.
fergal_dd
7

Попробуйте следующий шаблон:

.matches("[a-zA-Z ]*\\d+.*")
Константин Йовков
источник
Однако, если пользователь вежлив и говорит, что "please"это не удастся. Плюс в примере OP есть "?" для учета.
Кристофер
1
Вы уверены, что исправили?
Кристофер
Это выражение не работает для ответа, как "10"для образца.
fabdouglas
6

Решение, которое я выбрал, выглядит так:

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

Я уверен, что это не идеальное решение, но оно соответствовало моим потребностям. Спасибо всем за помощь. :)

Дуэйн
источник
1

Вы можете попробовать это

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

Поскольку вы хотите не только искать число, но и извлекать его, вам следует написать небольшую функцию, выполняющую это за вас. Идите по буквам, пока не найдете цифру. Ах, только что нашел нужный вам код в stackoverflow: найти целое число в строке . Посмотрите на принятый ответ.

Торстен Кеттнер
источник
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+.*")работает только для чисел, но не для других символов, таких как //или *и т. д.

Рикирас
источник
0

ASCII находится в начале UNICODE, поэтому вы можете сделать что-то вроде этого:

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

Я уверен, что вы сможете выяснить другие значения ...

Брэд Юань
источник