[java] 문자열에서 숫자를 추출하고 정수 배열을 얻는 방법은 무엇입니까?

문자열 변수 (기본적으로 숫자가 지정되지 않은 영어 문장)가 있고 모든 숫자를 정수 배열로 추출하고 싶습니다. 정규 표현식에 대한 빠른 솔루션이 있는지 궁금합니다.


Sean의 솔루션을 사용하고 약간 변경했습니다.

LinkedList<String> numbers = new LinkedList<String>();

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
   numbers.add(m.group());
}



답변

Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There are more than -2 and less than 12 numbers here");
while (m.find()) {
  System.out.println(m.group());
}

… 인쇄 -212.


-? 선행 음수 부호와 일치합니다. \ D는 숫자와 일치, 우리는 쓸 필요 \\\하지만 자바 문자열입니다. 따라서 \ d +는 하나 이상의 숫자와 일치합니다.


답변

replaceAlljava.lang.String 메소드 를 사용하는 방법 :

    String str = "qwerty-1qwerty-2 455 f0gfg 4";
    str = str.replaceAll("[^-?0-9]+", " ");
    System.out.println(Arrays.asList(str.trim().split(" ")));

산출:

[-1, -2, 455, 0, 4]

기술

[^-?0-9]+
  • [그리고 ]하나의 임의의 순서로, 즉, 한 번만 일치하는 문자 집합을 delimites
  • ^집합의 시작 부분에 사용되는 특수 식별자로 집합 에있는 모든 문자 대신 구분 된 집합에 없는 모든 문자를 일치시키는 데 사용됩니다 .
  • + 한 번에서 무제한으로 가능한 한 많이, 필요에 따라 환원
  • -? “-“및 “?”문자 중 하나
  • 0-9 “0”에서 “9”사이의 문자

답변

Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(myString);
while (m.find()) {
    int n = Integer.parseInt(m.group());
    // append n to list
}
// convert list to array, etc

실제로 [0-9]를 \ d로 바꿀 수 있지만 이중 백 슬래시 이스케이프가 포함되어 읽기가 더 어렵습니다.


답변

  StringBuffer sBuffer = new StringBuffer();
  Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+");
  Matcher m = p.matcher(str);
  while (m.find()) {
    sBuffer.append(m.group());
  }
  return sBuffer.toString();

소수를 유지하는 숫자를 추출하기위한 것입니다.


답변

허용 된 대답은 숫자를 감지하지만 형식이 지정된 숫자 (예 : 2,000) 또는 소수 (예 : 4.8)는 감지하지 않습니다. 그러한 사용을 위해 -?\\d+(,\\d+)*?\\.?\\d+?:

        Pattern p = Pattern.compile("-?\\d+(,\\d+)*?\\.?\\d+?");
        List<String> numbers = new ArrayList<String>();
        Matcher m = p.matcher("Government has distributed 4.8 million textbooks to 2,000 schools");
        while (m.find()) {
            numbers.add(m.group());
        }
        System.out.println(numbers);

산출:
[4.8, 2,000]


답변

유리수의 경우 다음을 사용하십시오. (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))


답변

Java 8을 사용하여 다음을 수행 할 수 있습니다.

String str = "There 0 are 1 some -2-34 -numbers 567 here 890 .";
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+"))
                 .filter(s -> !s.matches("-?"))
                 .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]

당신이 음수가없는 경우, 당신은 제거 할 수 replaceAll(사용 !s.isEmpty()에서 filter그와 같은 제대로 분할 일 만의로) 2-34(이 또한 순수에서 정규식으로 처리 할 수 split있지만, 상당히 복잡).

Arrays.stream우리 String[]Stream<String>.

filter선행 및 후행 빈 문자열과 -숫자의 일부가 아닌 문자열을 제거합니다 .

mapToInt(Integer::parseInt).toArray()전화 parseInt각은 String우리을 제공합니다 int[].


또는 Java 9에는 다음과 같은 것을 허용해야하는 Matcher.results 메소드가 있습니다.

Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 .");
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]

현재로서는 다른 답변에서 볼 수 있듯이 Pattern/ Matcher로 결과를 반복하는 것보다 큰 개선이 아니지만 다음을 사용하여 상당히 단순화 된 더 복잡한 작업을 수행하려는 경우 더 간단해야합니다. 스트림.