很好,你在这上面设置了一项赏金。
不幸的是,可能你已经知道,无法直接使用Java的字符串分割方法来完成此操作。
如果不能直接完成,那就没有必要把它弄成一个补丁,因为它实际上是一个补丁。
原因有很多,有些与此相关,有些则不相关。
首先,你需要定义一个良好的正则表达式作为基础。
这是我所知道的唯一一个能够验证和提取正确格式的正则表达式:
(
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
所以,看着这个基本的正则表达式,很明显你想要它匹配那种形式。
在split的情况下,你不想要它匹配这种形式,因为这就是你想要的位置
进行拆分。
当我查看Java的split时,我发现无论它匹配什么,它都会被排除
在结果数组之外。
所以,假定使用split,第一件要匹配(并消耗)的是所有不是
这种形式的内容。这部分将是像这样的:
(?:
(?!
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
.
)+
由于剩下的唯一东西是有效的十进制数,下一个断点将会在有效数字之间。
这部分加上第一部分,将会是这样:
(?:
(?!
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
.
)+
| # or,
(?<=
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
(?=
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
突然间,我们遇到了一个问题...变长回顾断言
所以,整个事情就结束了。
最后不幸的是,Java(据我所知)没有提供将捕获组内容(在正则表达式中匹配)作为结果数组中的元素的方法。
Perl有这个功能,但我找不到Java中的这个能力。
如果Java有这个功能,断点子表达式就可以合并成无缝分割。
像这样:
(?:
(?!
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
.
)*
(
(?= [+-]? \d* \.? \d )
[+-]? \d* \.? \d*
)
yourString.split(regex)
或while(matcher.find()){...}
也是可以接受的解决方案吗?在这种情况下,我反对使用split
,因为它可能会在结果数组的开头创建额外的空元素,就像在"notNumber123NotNumber".split(regexForNotNumber)
中返回["", "123"]
一样。 - Pshemo