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

Joh*_*nak 102 java regex arrays 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());
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*wen 165

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());
}
Run Code Online (Sandbox Code Playgroud)

...打印-212.


- ?匹配一个主要的负号 - 可选.\ d匹配一个数字,我们需要\\\Java字符串一样编写.所以,\ d +匹配1位或更多位数.

  • 我将表达式更改为Pattern.compile(" - ?[\\ d \\.] +")以支持浮点数.你肯定会带路我,Thx! (7认同)
  • 你可以通过解释你的正则表达来补充你的答案吗? (4认同)
  • - ?匹配一个主要的负号 - 可选.\ d匹配一个数字,我们需要在Java String中编写\ as \\.所以,\\ d +匹配1个以上的数字 (3认同)
  • 请注意,你的正则表达式接受像8.4.5..3这样的字符串 (3认同)

Max*_*tin 48

如何使用replaceAlljava.lang.String方法:

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

输出:

[-1, -2, 455, 0, 4]
Run Code Online (Sandbox Code Playgroud)

描述

[^-?0-9]+
Run Code Online (Sandbox Code Playgroud)
  • [并且]分隔一组要匹配的字符,即,任何顺序只有一次
  • ^在集合开头使用的特殊标识符,用于指示匹配分隔集中存在的所有字符,而不是集合中存在的所有字符.
  • + 在一次和无限次之间,尽可能多次,根据需要回馈
  • -? 其中一个字符是" - "和"?"
  • 0-9 "0"和"9"之间的字符

  • 你为什么要留下问号?此外,这将`-`本身视为一个数字,以及诸如`9 -`,`--- 6`和`1-2-3`之类的东西. (4认同)

sid*_*eal 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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果使用" - ?[0-9] +",你的也会处理负数 (2认同)

小智 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();
Run Code Online (Sandbox Code Playgroud)

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


Mug*_*mba 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);
Run Code Online (Sandbox Code Playgroud)

输出: [4.8, 2,000]

  • @JulienS.:我不同意。这个正则表达式的作用远远超出了OP的要求,而且它的作用是错误的。(至少,小数部分应该在一个可选组中,其中的所有内容都是必需的并且贪婪的:`(?:\.\d+)?`。) (2认同)

Duk*_*ing 5

使用 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]
Run Code Online (Sandbox Code Playgroud)

如果你没有负数,你可以去掉replaceAll(并使用!s.isEmpty()in filter),因为这只是为了正确地分割类似的东西2-34(这也可以纯粹用正则表达式 in 来处理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]
Run Code Online (Sandbox Code Playgroud)

就目前情况而言,与仅使用Pattern/循环结果相比,这些都没有很大的改进Matcher,如其他答案所示,但如果您想用更复杂的操作来跟进,那么它应该更简单,这些操作可以通过使用来显着简化溪流。