문자열에 숫자가 포함되어 있는지 확인 Java


102

사용자가 다음 형식으로 문자열을 입력하는 프로그램을 작성 중입니다.

"What is the square of 10?"
  1. 문자열에 숫자가 있는지 확인해야합니다.
  2. 그런 다음 숫자 만 추출합니다.
  3. 내가 사용하는 경우 .contains("\\d+").contains("[0-9]+"), 프로그램은 문자열 입력이 무엇인지에 상관없이의 번호를 찾을 수는 없지만 .matches("\\d+")숫자 만있는 경우에만 작업을 것이다.

찾기 및 추출을위한 솔루션으로 무엇을 사용할 수 있습니까?


입력 문자열에서 숫자뿐만 아니라 첫 번째 숫자를 추출하려면 내 대답을 참조하십시오.
Sajal Dutta 2013 년

답변:


229

이 시도

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

2
이중 백 슬래시는 무엇을합니까?
ankit

15
설명하자면 :. *는 \\ d + (두 번째 백 슬래시를 이스케이프하는 것으로 생각하는 이중 백 슬래시)보다 0에서 무한 발생까지의 모든 문자를 의미하고 \ d +는 1 번에서 무한까지의 숫자를 의미합니다.
Giudark

6
그것은 외계인의 마법이 아니라 비밀스런 BS입니다. 아무도 이런 일을 할 수 없었던 시절부터 그것을 발명 한 엔지니어들입니다. 왜냐하면 그것은 기본적으로 제작자 만이 그것을 공유 할 때까지 알고있는 비밀 코드이기 때문입니다.
JamisonMan111

하나의 숫자 만 있으면 솔루션이 충분하므로 수정되었습니다.이 경우에는 하나 이상의 숫자가 필요하지 않습니다.
Yassin Hajaj

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

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

추출하는 것을 보지 못해서 죄송합니다. string에서 숫자를 추출하려면이 코드를 쉽게 편집 할 수 있습니다.
Melih Altıntaş 2013 년

10

s=s.replaceAll("[*a-zA-Z]", "") 모든 알파벳을 대체합니다.

s=s.replaceAll("[*0-9]", "") 모든 숫자를 대체합니다.

위의 두 가지 대체를 수행하면 모든 특수 문자 문자열을 얻을 수 있습니다.

a에서 정수만 추출하려는 경우 String s=s.replaceAll("[^0-9]", "")

A에서 알파벳 만 추출하려면 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

아래 코드는 "자바에서 문자열에 숫자가 포함되어 있는지 확인"에 충분합니다.

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 2018 년

또한 이것은 작동하지 않습니다 ... 테스트는 작동하지만 123TEST는 작동하지 않습니다.
fergal_dd 2019


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 : find integer in string에서 필요한 코드를 찾았습니다 . 받아 들여진 대답을보십시오.


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'

나는 당신이 다른 가치를 알아낼 수있을 것이라고 확신한다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.