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


102

Я пишу програму, де користувач вводить String у такому форматі:

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

Що я можу використовувати як рішення для пошуку та вилучення?


Якщо ви хочете витягнути перше число, а не лише цифру з рядка введення, дивіться мою відповідь.
Sajal Dutta

Відповіді:


229

спробуйте це

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

2
що робить подвійний нахил?
анкіт

15
Для пояснення:. * Означає будь-який символ від 0 до нескінченного виникнення, ніж \\ d + (подвійний зворотний косий я думаю - це просто уникнути другого косого кута) і \ d + означає цифру від 1 до нескінченного часу.
Джударк

6
Це не чужа магія, це криптовалюта BS, ще з тих часів, коли ніхто не міг зробити цей матеріал, окрім інженерів, які його винайшли, оскільки це в основному секретний код, який знають лише творці, поки вони не поділяться ним.
JamisonMan111

Змінено, тому що, якщо присутня лише одна цифра, рішення є досить хорошим, не потрібно мати в цьому випадку 1 або більше цифр.
Яссін Хаджай

26

Якщо ви хочете витягнути перше число з вхідного рядка, ви можете зробити це,

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

Вибачте, що не побачив вилучення. Якщо ви хочете витягнути число в рядку, ви можете легко змінити цей код.
Melih Altıntaş

10

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

s=s.replaceAll("[*0-9]", "") замінює всі числові

якщо ви зробите вище двох замін, ви отримаєте всі спеціальні символьні рядки

Якщо ви бажаєте витягнути з a лише цілі числа 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();

Це працює дуже добре. Єдине, на що потрібно стежити - це те, що рядок містить зворотну косу рису. Якщо це так, то я думаю, що це призведе до помилки "незаконного втечі".
w3bshark

це найкраще
Yashwin Munsadwala

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]))");
Гаурав Тяги

також це не працює ... тест працює, але 123TEST не працюватиме.
fergal_dd

7

Спробуйте наступну схему:

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

Однак якщо користувач ввічливий і каже, що "please"це не вдасться. Плюс у прикладі ОП є "?" для обліку.
Крістофер

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'

Я впевнений, що ви можете з'ясувати інші значення ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.