문자열 변수 (기본적으로 숫자가 지정되지 않은 영어 문장)가 있고 모든 숫자를 정수 배열로 추출하고 싶습니다. 정규 표현식에 대한 빠른 솔루션이 있는지 궁금합니다.
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());
}
… 인쇄 -2
및 12
.
-? 선행 음수 부호와 일치합니다. \ D는 숫자와 일치, 우리는 쓸 필요 \
로 \\
하지만 자바 문자열입니다. 따라서 \ d +는 하나 이상의 숫자와 일치합니다.
답변
replaceAll
java.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
로 결과를 반복하는 것보다 큰 개선이 아니지만 다음을 사용하여 상당히 단순화 된 더 복잡한 작업을 수행하려는 경우 더 간단해야합니다. 스트림.