How to extract numbers from a string and get an array of ints?

我有一个字符串变量(基本上是一个没有指定数目的英语句子) ,我想提取所有的数字到一个整数数组。我想知道是否有一个正则表达式的快速解决方案?


我用了肖恩的方法,稍微改动了一下:

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


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

对于有理数,使用这个: (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

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

... prints -2 and 12.


-?匹配一个前导负符号——可选。D 匹配一个数字,但是我们需要在 Java 字符串中将 \写成 \\。因此,d + 匹配1个或多个数字。

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

您实际上可以用 d 替换[0-9] ,但是这涉及到双反斜杠转义,这使得阅读更加困难。

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

这是用于提取保留小数的数字

我建议检查 ASCII 值以从 String 中提取数字 假设你有一个 input String as myname12345,如果你只想要 提取号码12345,你可以先把字符串转换成 字符数组,然后使用下面的 伪代码

    for(int i=0; i < CharacterArray.length; i++)
{
if( a[i] >=48 && a[i] <= 58)
System.out.print(a[i]);
}

一旦数字被提取出来,将它们附加到一个数组中

希望这个能帮上忙

如何使用 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]+
  • []将一组字符分隔为单个匹配,即任意顺序只有一次匹配
  • ^在集合开头使用的特殊标识符,用于指示匹配分隔集合中存在的所有字符 没有,而不是集合中存在的所有字符。
  • 在一次和无限次之间,尽可能多的次数,根据需要进行回馈
  • 其中一个字母“-”和“ ?”
  • 在“0”和“9”之间的字符

接受的答案检测数字,但不检测格式化的数字,例如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]

使用 Java8,你可以:

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(在 filter中使用 !s.isEmpty()) ,因为这只是为了正确地分割类似于 2-34的内容(这也可以在 split中完全用正则表达式处理,但是它相当复杂)。

Arrays.stream把我们的 String[]变成 Stream<String>

filter去掉了前导和尾随的空字符串,以及任何不是数字一部分的 -

mapToInt(Integer::parseInt).toArray()在每个 String上调用 parseInt给我们一个 int[]


Alternatively, Java 9 has a Matcher 结果 method, which should allow for something like:

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循环处理结果,但是如果您想要使用更复杂的操作来跟进这个问题,那么应该会更简单,因为使用流可以大大简化这些操作。

我发现这个表达很简单

String[] extractednums = msg.split("\\\\D++");

用这个提取所有的实数。

public static ArrayList<Double> extractNumbersInOrder(String str){


str+='a';
double[] returnArray = new double[]{};


ArrayList<Double> list = new ArrayList<Double>();
String singleNum="";
Boolean numStarted;
for(char c:str.toCharArray()){


if(isNumber(c)){
singleNum+=c;


} else {
if(!singleNum.equals("")){  //number ended
list.add(Double.valueOf(singleNum));
System.out.println(singleNum);
singleNum="";
}
}
}


return list;
}




public static boolean isNumber(char c){
if(Character.isDigit(c)||c=='-'||c=='+'||c=='.'){
return true;
} else {
return false;
}
}

Fraction and grouping characters for representing real numbers may differ between languages. The same real number could be written in very different ways depending on the language.

德语中的200万

2000.000.00

还有英语

2.000.000.00

以语言不可知的方式从给定字符串中完全提取实数的一种方法:

public List<BigDecimal> extractDecimals(final String s, final char fraction, final char grouping) {
List<BigDecimal> decimals = new ArrayList<BigDecimal>();
//Remove grouping character for easier regexp extraction
StringBuilder noGrouping = new StringBuilder();
int i = 0;
while(i >= 0 && i < s.length()) {
char c = s.charAt(i);
if(c == grouping) {
int prev = i-1, next = i+1;
boolean isValidGroupingChar =
prev >= 0 && Character.isDigit(s.charAt(prev)) &&
next < s.length() && Character.isDigit(s.charAt(next));
if(!isValidGroupingChar)
noGrouping.append(c);
i++;
} else {
noGrouping.append(c);
i++;
}
}
//the '.' character has to be escaped in regular expressions
String fractionRegex = fraction == POINT ? "\\." : String.valueOf(fraction);
Pattern p = Pattern.compile("-?(\\d+" + fractionRegex + "\\d+|\\d+)");
Matcher m = p.matcher(noGrouping);
while (m.find()) {
String match = m.group().replace(COMMA, POINT);
decimals.add(new BigDecimal(match));
}
return decimals;
}

如果您想排除单词中包含的数字,比如 bar1或 aa1bb,那么将单词边界 b 添加到任何基于正则表达式的答案中。例如:

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

展示:

2
12
public static String extractNumberFromString(String number) {
String num = number.replaceAll("[^0-9]+", " ");
return num.replaceAll(" ", "");
}

只从字符串中提取数字