Java vs JavaScript 拆分行为

2022-09-05 00:23:28

Java和JavaScript之间的拆分功能似乎有所不同。

我不需要完全匹配某个正则表达式标准,或者使用基于前瞻的正则表达式。我的问题在于,在拆分正则表达式(这是一组简单的字符而不是表达式)的最终匹配之后,空匹配被尾随。

以下是我试图实现的输出的示例,以及我真正得到了什么。

爪哇岛

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~")

/* results with an array of length 8 */ (java.lang.String[]) [, , , A, B, C, D, E]

Javascript

 "~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~".split("~#~")
 /* results with an array of length 11 */ ["", "", "", "A", "B", "C", "D", "E", "", "", ""]

我真的不能把我的手放在一个很好的解释上,因为我正在使用Java应用程序,分裂给我带来了麻烦,我想要与JavaScript相同的结果。我怎样才能得到它?


答案 1

Javadoc on :split(String regex)

此方法的工作方式就像调用具有给定表达式和极限参数零的双参数拆分方法一样。因此,尾随空字符串不包括在结果数组中。

Javadoc on :split(String regex, int limit)

如果 n 为非正数,则模式将尽可能多地应用,并且数组可以具有任何长度。如果 n 为零,则模式将尽可能多地应用,数组可以具有任何长度,并且将丢弃尾随的空字符串。

所以。。。 应该做这个把戏。split("~#~", -1)


答案 2

Java的split()文档明确提到尾随的空字符串将不包括在内。

此方法的工作方式就像调用具有给定表达式和极限参数零的双参数拆分方法一样。因此,尾随空字符串不包括在结果数组中。

但你可以通过以下方式实现它

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~" , -1)

这是一个重载方法