如何从字符串中提取数字并获得一组int?

时间:2010-03-02 22:33:36

标签: java arrays regex string

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


我使用了Sean的解决方案并稍微改了一下:

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

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

13 个答案:

答案 0 :(得分:162)

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匹配一个数字,我们需要在Java字符串中将\写为\\。所以,\ d +匹配1位或更多位数。

答案 1 :(得分:47)

如何使用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“0”和“9”之间范围内的字符

答案 2 :(得分:18)

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],但这涉及双反斜杠转义,这使得它更难阅读。

答案 3 :(得分: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();

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

答案 4 :(得分:5)

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

答案 5 :(得分:4)

有理数的

使用这个:(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

答案 6 :(得分:3)

使用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.streamString[]变为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循环结果的重大改进,如其他答案中所示,但如果您想要遵循这一点,它应该更简单随着使用流而显着简化的更复杂的操作。

答案 7 :(得分:1)

我建议检查ASCII值以从String中提取数字 假设您有一个输入字符串作为myname12345 ,如果您只想提取数字12345 ,您可以先将字符串转换为字符数组然后使用以下伪代码

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

提取数字后,将它们附加到数组

希望这有帮助

答案 8 :(得分:1)

我发现这个表达式最简单

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

答案 9 :(得分:1)

使用此提取所有实数。

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

答案 10 :(得分:1)

表示实数的分数字符和分组字符可能会因语言而异。根据语言,可以用不同的方式写相同的实数。

两百万德国人

2,000,000.00

和英语

2.000.000,00

一种以与语言无关的方式从给定字符串中完全提取实数的方法:

dff %>%
  rowwise() %>%
  do(res = .data) %>% 
  .[[1]] %>% 
  head(1)

# [[1]]
# [[1]]$a
# [1] 1
# 
# [[1]]$b
# [1] 1

答案 11 :(得分:1)

如果要排除单词中包含的数字(例如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

答案 12 :(得分:0)

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

仅从字符串中提取数字