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

Sto*_*ica 7 java regex

我想从字符串中提取数字,如下所示:

String numbers[] = "M0.286-3.099-0.44c-2.901,-0.436,,,123,0.123,.34".split(PATTERN);
Run Code Online (Sandbox Code Playgroud)

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

  • 0.286
  • -3.099
  • -0.44
  • -2.901
  • -0.436
  • 123
  • 0.123
  • 0.34

那是:

  • 可能有垃圾字符,如"M","c","c"
  • " - "符号将包含在数字中,而不是分开
  • "数字"可以是任何Float.parseFloat可以解析的东西,因此.34是有效的

到目前为止我所拥有的:

String PATTERN = "([^\\d.-]+)|(?=-)";
Run Code Online (Sandbox Code Playgroud)

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

  • 在示例中不跳过起始垃圾"M"
  • 不处理连续垃圾,就像,,,在中间一样

如何修复PATTERN以使其工作?

Fed*_*zza 3

您可以使用这样的正则表达式:

([-.]?\d+(?:\.\d+)?)
Run Code Online (Sandbox Code Playgroud)

工作演示

在此输入图像描述

比赛信息:

MATCH 1
1.  [1-6]   `0.286`
MATCH 2
1.  [6-12]  `-3.099`
MATCH 3
1.  [12-17] `-0.44`
MATCH 4
1.  [18-24] `-2.901`
MATCH 5
1.  [25-31] `-0.436`
MATCH 6
1.  [34-37] `123`
MATCH 7
1.  [38-43] `0.123`
MATCH 8
1.  [44-47] `.34`
Run Code Online (Sandbox Code Playgroud)

更新

贾威的方法

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

(-?(?:\d+)?\.?\d+)
Run Code Online (Sandbox Code Playgroud)

要了解此正则表达式背后发生的情况,您可以检查此Debuggex 图像:

正则表达式可视化

发动机说明:

1st Capturing group (-?(?:\d+)?\.?\d+)
   -? -> matches the character - literally zero and one time
   (?:\d+)? -> \d+ match a digit [0-9] one and unlimited times (using non capturing group)
   \.? matches the character . literally zero and one time
   \d+ match a digit [0-9] one and unlimited times
Run Code Online (Sandbox Code Playgroud)