通过拆分正则表达式从Java中的String中提取数字

前端之家收集整理的这篇文章主要介绍了通过拆分正则表达式从Java中的String中提取数字前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从字符串中提取数字,如下所示:
  1. String numbers[] = "M0.286-3.099-0.44c-2.901,-0.436,123,0.123,.34".split(PATTERN);

从这样的字符串我想提取这些数字:

> 0.286
> -3.099
> -0.44
> -2.901
> -0.436
> 123
> 0.123
> .34

那是:

>可能有垃圾字符,如“M”,“c”,“c”
>“ – ”符号将包含在数字中,而不是分开
>“数字”可以是Float.parseFloat可以解析的任何内容,因此.34有效

到目前为止我所拥有的:

  1. String PATTERN = "([^\\d.-]+)|(?=-)";

这在某种程度上起作用,但显然远非完美:

>在示例中不跳过起始垃圾“M”
>不处理连续垃圾,如中间的,

如何修复PATTERN以使其工作?

你可以使用这样的正则表达式:
  1. ([-.]?\d+(?:\.\d+)?)

Working demo

比赛信息:

  1. MATCH 1
  2. 1. [1-6] `0.286`
  3. MATCH 2
  4. 1. [6-12] `-3.099`
  5. MATCH 3
  6. 1. [12-17] `-0.44`
  7. MATCH 4
  8. 1. [18-24] `-2.901`
  9. MATCH 5
  10. 1. [25-31] `-0.436`
  11. MATCH 6
  12. 1. [34-37] `123`
  13. MATCH 7
  14. 1. [38-43] `0.123`
  15. MATCH 8
  16. 1. [44-47] `.34`

更新

Jawee方法

正如Jawee在他的评论中指出的那样.34.34存在问题,所以你可以使用他的正则表达式解决这个问题.感谢Jawee指出这一点.

  1. (-?(?:\d+)?\.?\d+)

要了解这个正则表达式背后发生的事情你可以查看Debuggex
图片

发动机说明:

  1. 1st Capturing group (-?(?:\d+)?\.?\d+)
  2. -? -> matches the character - literally zero and one time
  3. (?:\d+)? -> \d+ match a digit [0-9] one and unlimited times (using non capturing group)
  4. \.? matches the character . literally zero and one time
  5. \d+ match a digit [0-9] one and unlimited times

猜你在找的正则表达式相关文章