我想从字符串中提取数字,如下所示:
> -3.099
> -0.44
> -2.901
> -0.436
> 123
> 0.123
> .34 @H_301_3@那是: @H_301_3@>可能有垃圾字符,如“M”,“c”,“c”
>“ – ”符号将包含在数字中,而不是分开
>“数字”可以是Float.parseFloat可以解析的任何内容,因此.34有效 @H_301_3@到目前为止我所拥有的:
>不处理连续垃圾,如中间的, @H_301_3@如何修复PATTERN以使其工作?
String numbers[] = "M0.286-3.099-0.44c-2.901,-0.436,123,0.123,.34".split(PATTERN);@H_301_3@从这样的字符串我想提取这些数字: @H_301_3@> 0.286
> -3.099
> -0.44
> -2.901
> -0.436
> 123
> 0.123
> .34 @H_301_3@那是: @H_301_3@>可能有垃圾字符,如“M”,“c”,“c”
>“ – ”符号将包含在数字中,而不是分开
>“数字”可以是Float.parseFloat可以解析的任何内容,因此.34有效 @H_301_3@到目前为止我所拥有的:
String PATTERN = "([^\\d.-]+)|(?=-)";@H_301_3@这在某种程度上起作用,但显然远非完美: @H_301_3@>在示例中不跳过起始垃圾“M”
>不处理连续垃圾,如中间的, @H_301_3@如何修复PATTERN以使其工作?
你可以使用这样的正则表达式:
图片: @H_301_3@发动机说明:
([-.]?\d+(?:\.\d+)?)@H_301_3@Working demo @H_301_3@比赛信息:
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`@H_301_3@更新 @H_301_3@Jawee的方法 @H_301_3@正如Jawee在他的评论中指出的那样.34.34存在问题,所以你可以使用他的正则表达式解决这个问题.感谢Jawee指出这一点.
(-?(?:\d+)?\.?\d+)@H_301_3@要了解这个正则表达式背后发生的事情你可以查看Debuggex
图片: @H_301_3@发动机说明:
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