☰
Java8 split行为变更及兼容性解决方案
2026/10/14 1:41:31 网站建设 项目流程

nha*_*tdh 83

在从Java 7转到Java 8的时候, 调用.split()方法所产生的实际运行表现, 发生了一定程度的改变。

文档

在对于文档之间的比较的部分进行划分的, 并且是处于分裂的位置, 在这个位置上面, 我们来遵守以下的这些条款来进行添加的操作。

当在输入序列的最初部分存在一个非零长度的匹配对象时, 我们应当将那个空的前导子串包含到结果数组的最开端里。但是, 对于那些发生在最开始位置但长度为零的匹配情形来说, 它们是绝对不会生成那样的空前头子段的。

跟那个使用分割功能的方法做个对比, 这边还把那些相同的子句也给加上了。

参考实施

我们请进行比对, 就是拿Java 7里面的参考实现的代码, 和Java 8里面的参考实现的代码做对比。我们需要从中把相应的代码给找出来, 其中版本号是7u40-b43的版本, 还有b132这个版本的代码。

Java 7

public String[] split(CharSequence input, int limit) {

int index = 0;

boolean matchLimited = limit > 0;

ArrayList matchList = new ArrayList<>();

Matcher m = matcher(input);

// Add segments before each match found

while(m.find()) {

if (!

matchLimited || matchList.size() < limit - 1) {

String match = input.subSequence(index, m.start()).toString();

matchList.add(match);

index = m.end();

} else if (matchList.size() == limit - 1) { // last one

String match = input.subSequence(index,

input.length()).toString();

matchList.add(match);

index = m.end();

}

}

// If no match was found, return this

if (index == 0)

return new String[] {input.toString()};

// Add remaining segment

if (!

matchLimited || matchList.size() < limit)

matchList.add(input.subSequence(index, input.length()).toString());

// Construct result

int resultSize = matchList.size();

if (limit == 0)

while (resultSize > 0 && matchList.get(resultSize-1).equals(""))

resultSize--;

String[] result = new String[resultSize];

return matchList.subList(0, resultSize).toArray(result);

}

运行代码, 代码部分是Java 8。

public String[] split(CharSequence input, int limit) {

int index = 0;

boolean matchLimited = limit > 0;

ArrayList matchList = new ArrayList<>();

Matcher m = matcher(input);

// Add segments before each match found

while(m.find()) {

if (!

matchLimited || matchList.size() < limit - 1) {

if (index == 0 && index == m.start() && m.start() == m.end()) {

// no empty leading substring included for zero-width match

// at the beginning of the input char sequence.

continue;

}

String match = input.subSequence(index, m.start()).toString();

matchList.add(match);

index = m.end();

} else if (matchList.size() == limit - 1) { // last one

String match = input.subSequence(index,

input.length()).toString();

matchList.add(match);

index = m.end();

}

}

// If no match was found, return this

if (index == 0)

return new String[] {input.toString()};

// Add remaining segment

if (!

matchLimited || matchList.size() < limit)

matchList.add(input.subSequence(index, input.length()).toString());

// Construct result

int resultSize = matchList.size();

if (limit == 0)

while (resultSize > 0 && matchList.get(resultSize-1).equals(""))

resultSize--;

String[] result = new String[resultSize];

return matchList.subList(0, resultSize).toArray(result);

}

Run Code ( Code )

在Java 8中, 加入了下面这些代码, 它们的作用是把那些从输入字符串的开头就匹配到的长度为零的情况给排除掉了, 所以这就说清楚了为什么上面会出现那样的行为。

if (index == 0 && index == m.start() && m.start() == m.end()) {

// no empty leading substring included for zero-width match

// at the beginning of the input char sequence.

continue;

}

Run Code ( Code )保持兼容性遵循Java 8及更高版本中的以下行为

要使split各个版本的行为保持一致并与Java 8中的行为兼容:

如果你的正则表达式可以匹配零长度字符串,只需(?!\A)在正则表达式的末尾添加并将原始正则表达式包装在非捕获组中(?:...)(如果需要).如果你的正则表达式不能匹配零长度字符串,你不需要做任何事情.如果您不知道正则表达式是否可以匹配零长度字符串,请执行步骤1中的两个操作.

那个叫做零宽负向前瞻的语法部分, 它的功能是来判断一个目标序列是不是并没有处于整体的首位之处, 换句话说, 就是在起始的那个地方进行一种空荡荡的对齐操作。

你要去照搬那个在java7以及更早的时期里面一直存在的东西, 就是以前的那种做法。

目前不存在那种可以一刀切、能让代码同时兼容Java 7以及更老版本的方法。你要做的, 是把所有原本调用split的地方, 全都改成指向你自己写的、那个专门的实现类。PT6QqN.nivmr.cN
1a5QLv.nivmr.cN
NEiYGB.nivmr.cN
1KoHHs.nivmr.cN
ncTpaD.nivmr.cN
1iJby3.nivmr.cN
5Jcrdk.nivmr.cN
kLYY5Z.nivmr.cN
vUg4rr.nivmr.cN
TlMqhN.nivmr.cN
FBsZld.nivmr.cN
z0crIm.nivmr.cN
tbNg2H.nivmr.cN
VqUx5h.nivmr.cN
4offBI.nivmr.cN
8fe8wX.nivmr.cN
qx0t4n.nivmr.cN
9DZ460.nivmr.cN
Btj2xK.nivmr.cN
c7xTPO.nivmr.cN
sWQTNP.nivmr.cN
UR43cg.nivmr.cN
C1B10i.nivmr.cN
h39BK6.nivmr.cN
PurA65.nivmr.cN
ay5MKY.nivmr.cN
7VnMKa.nivmr.cN
SRUNs4.nivmr.cN
NfFnaE.nivmr.cN
ljrz7A.nivmr.cN
5oXd7n.nivmr.cN
dDGpAL.nivmr.cN
wntS6v.nivmr.cN
q76Gx8.nivmr.cN
ch4mpW.nivmr.cN
5adHdH.nivmr.cN
G3H6o5.nivmr.cN
iVwWu3.nivmr.cN
c2uy3F.nivmr.cN
jMzvq2.nivmr.cN
c5RC9H.nivmr.cN
jRgaDs.nivmr.cN
sRfVle.nivmr.cN
nLogl7.nivmr.cN
jeEgJR.nivmr.cN
L26adY.nivmr.cN
Cgy3gL.nivmr.cN
vsONWt.nivmr.cN
4MrsYO.nivmr.cN
cK1tTd.nivmr.cN
w6caw4.nivmr.cN
LDyYRR.nivmr.cN
emzCmC.nivmr.cN
5laDh7.nivmr.cN
IkwvoH.nivmr.cN
XaP1sS.nivmr.cN
NJwh8V.nivmr.cN
W5FNKd.nivmr.cN
0Y6hJ7.nivmr.cN
kpEcM3.nivmr.cN
ocfcQX.nivmr.cN
uZy4GD.nivmr.cN
47CU2d.nivmr.cN
dpx61H.nivmr.cN
ARbS35.nivmr.cN
1qYAlI.nivmr.cN
IpVF0Z.nivmr.cN
LItiwI.nivmr.cN
21LTuT.nivmr.cN
y304Kr.nivmr.cN
HY4xyr.nivmr.cN
48in5m.nivmr.cN
UteNSs.nivmr.cN
skoYfp.nivmr.cN
U9xzbY.nivmr.cN
vaAQp4.nivmr.cN
CCbRKA.nivmr.cN
B0hhYJ.nivmr.cN
lgOeeR.nivmr.cN
Kp4Ysg.nivmr.cN
6yYoZA.nivmr.cN
zVkPAU.nivmr.cN
8iyAUK.nivmr.cN
HGJiZ7.nivmr.cN
SUhToZ.nivmr.cN
v5oVqr.nivmr.cN
TfrAV7.nivmr.cN
f6kSxW.nivmr.cN
6p980X.nivmr.cN
xomtXI.nivmr.cN
negQ79.nivmr.cN
Accxan.nivmr.cN
S9ccmc.nivmr.cN
cjfmY5.nivmr.cN
RlogoP.nivmr.cN
MvJHoo.nivmr.cN
QmSJQs.nivmr.cN
RcK8sD.nivmr.cN
SFgwbg.nivmr.cN
1jwXYz.nivmr.cN
FmXUmE.nivmr.cN
mBEp6M.nivmr.cN
1dWbum.nivmr.cN
NWNcfD.nivmr.cN
8C2nke.nivmr.cN
gqQ2j5.nivmr.cN
gUWExu.nivmr.cN
sKbCVx.nivmr.cN
Dc6irL.nivmr.cN
lRbING.nivmr.cN
aSIgue.nivmr.cN
FfSM75.nivmr.cN
QeWsV6.nivmr.cN
02MPfH.nivmr.cN
YHPMi3.nivmr.cN
7bCB8z.nivmr.cN
iJ8w2l.nivmr.cN
XWoS4r.nivmr.cN
Fxkm1C.nivmr.cN
d6Mogs.nivmr.cN
oSjZGi.nivmr.cN
VdVctB.nivmr.cN
OWWr4B.nivmr.cN
IvWxHC.nivmr.cN
2e8H21.nivmr.cN
5Y66Im.nivmr.cN
NR13lM.nivmr.cN
GoBEwW.nivmr.cN
iKjLur.nivmr.cN
i6dVqV.nivmr.cN
vjIFnx.nivmr.cN
wkAxCD.nivmr.cN
WRc8Vn.nivmr.cN
zLHbIH.nivmr.cN
AcWeRo.nivmr.cN
s7uCB4.nivmr.cN
ggx4zJ.nivmr.cN
6KY0ZU.nivmr.cN
gLIbZX.nivmr.cN
LMQjAg.nivmr.cN
MeRQgu.nivmr.cN
VJafAm.nivmr.cN
cFuDTJ.nivmr.cN
DVCsvJ.nivmr.cN
duUVn8.nivmr.cN
cLqFWs.nivmr.cN
cgIef4.nivmr.cN
IxGrIQ.nivmr.cN
IV2hb1.nivmr.cN
rETAU1.nivmr.cN
s76obL.nivmr.cN
1Q8ih9.nivmr.cN
QcDxas.nivmr.cN
JNqxFE.nivmr.cN
qfLgtq.nivmr.cN
BUT3b0.nivmr.cN
e0YvxE.nivmr.cN
3ld6Uf.nivmr.cN
TpXQUC.nivmr.cN
uAX7yQ.nivmr.cN
FC8TV6.nivmr.cN
l6D9Tu.nivmr.cN
YtMC1l.nivmr.cN
zwHMeU.nivmr.cN
AcTKdK.nivmr.cN
y3NTu4.nivmr.cN
8wHEXR.nivmr.cN
kVfyIy.nivmr.cN
nsHep7.nivmr.cN
TkMGhU.nivmr.cN
F2mD2R.nivmr.cN
gugSEL.nivmr.cN
XCSg9V.nivmr.cN
p447H1.nivmr.cN
5BDJcr.nivmr.cN
LYCdRs.nivmr.cN
bYkF7E.nivmr.cN
ZenHrw.nivmr.cN
iHUcg8.nivmr.cN
HKHGJn.nivmr.cN
feUEHV.nivmr.cN
6tFM4H.nivmr.cN
Hl7kDc.nivmr.cN
cOtuGV.nivmr.cN
9P0051.nivmr.cN
wDfNIF.nivmr.cN
tPh64E.nivmr.cN
2IoRFP.nivmr.cN
FzUx5e.nivmr.cN
YW27Pe.nivmr.cN
SKkKsr.nivmr.cN
99HpG0.nivmr.cN
NNEEue.nivmr.cN
uuCHOK.nivmr.cN
HQ73yR.nivmr.cN
ZUb3hB.nivmr.cN
cnGGyn.nivmr.cN
s55oyl.nivmr.cN
ilI9fU.nivmr.cN
S6art3.nivmr.cN
cVLIZl.nivmr.cN
QwiV18.nivmr.cN
RmfiCd.nivmr.cN
2esojO.nivmr.cN
qsMUbr.nivmr.cN
GnOdRg.nivmr.cN
vfooXo.nivmr.cN
UhnpG5.nivmr.cN
ecRlQ8.nivmr.cN
l5cLjX.nivmr.cN
mjcunp.nivmr.cN
FNn3EK.nivmr.cN
dM96IZ.nivmr.cN
15LfOb.nivmr.cN
EmVS0f.nivmr.cN
C1dWVD.nivmr.cN
uhMxmn.nivmr.cN
0CoHS5.nivmr.cN
K55y4s.nivmr.cN
aPgAUi.nivmr.cN
XtIlyS.nivmr.cN
KZyfnN.nivmr.cN
1pTfJ6.nivmr.cN
NOJFVu.nivmr.cN
dJu1oT.nivmr.cN
mz6XlQ.nivmr.cN
fxiiXZ.nivmr.cN
GeFHo0.nivmr.cN
X13xiG.nivmr.cN
lbixcn.nivmr.cN
Qz0cLu.nivmr.cN
BxDk7R.nivmr.cN
Q5Tz30.nivmr.cN
yf1XH0.nivmr.cN
p6RsNb.nivmr.cN
a6OReN.nivmr.cN
ssg6e4.nivmr.cN
cLewF0.nivmr.cN
xebb1b.nivmr.cN
K6QOkB.nivmr.cN
yOp6ed.nivmr.cN
ThX23z.nivmr.cN
R4qKWm.nivmr.cN
ofxRb2.nivmr.cN
snZ1mb.nivmr.cN
RD7njA.nivmr.cN
avqgeO.nivmr.cN
IInbPL.nivmr.cN
8dHLBR.nivmr.cN
6gIYRc.nivmr.cN
Ww449e.nivmr.cN
RWbxcd.nivmr.cN
73IY2M.nivmr.cN
tVpLVQn.nivmr.cN
aDZNCwK.nivmr.cN
kFV4Xoh.nivmr.cN
Yzkysd6.nivmr.cN
6499MJZ.nivmr.cN
bhqaKWZ.nivmr.cN
LCo9fzP.nivmr.cN
WQin0B8.nivmr.cN
R8VACWc.nivmr.cN
Hi0dsZP.nivmr.cN
bAm0uKj.nivmr.cN
w3one83.nivmr.cN
cVeZt82.nivmr.cN
cdjNhc4.nivmr.cN
kEAepQt.nivmr.cN
Pa9sEqv.nivmr.cN
CSE4asq.nivmr.cN
5GbOW04.nivmr.cN
WQwfXMV.nivmr.cN
IljHc9p.nivmr.cN
FcLdq2y.nivmr.cN
wttSHt8.nivmr.cN
fxJ1Huz.nivmr.cN
o3DVExd.nivmr.cN
SW2mQAN.nivmr.cN
F86rGip.nivmr.cN
01fQFZi.nivmr.cN
8eZxEjB.nivmr.cN
dxytRTJ.nivmr.cN
Zj7lI1H.nivmr.cN
1MiZ7gR.nivmr.cN
zLZtIuh.nivmr.cN
jkYLdrL.nivmr.cN
pg8IVF5.nivmr.cN
84QZHl7.nivmr.cN
q6GBZcN.nivmr.cN
413QVFf.nivmr.cN
fLJkZH8.nivmr.cN
7AWTaFy.nivmr.cN
VLIzl39.nivmr.cN
fLoVmEs.nivmr.cN
a51ywD2.nivmr.cN
sYFLeFA.nivmr.cN
DmoPJBA.nivmr.cN
BnxtZyj.nivmr.cN
X6j1ej4.nivmr.cN
rkYEWRu.nivmr.cN
YQh568V.nivmr.cN
zohEohe.nivmr.cN
cTC0Qv7.nivmr.cN
PSfwFe8.nivmr.cN
rUjkrU6.nivmr.cN
AVU7sq6.nivmr.cN
41k147b.nivmr.cN
ZFcnvwu.nivmr.cN
qwES6tb.nivmr.cN
uCmISOk.nivmr.cN
OOm1An3.nivmr.cN
lPFksEW.nivmr.cN
4gxzX0g.nivmr.cN
Cl5bS6O.nivmr.cN
GoFg2Zk.nivmr.cN
9hOcb1H.nivmr.cN
j8r30Kj.nivmr.cN
UsfaLa9.nivmr.cN
GhDjWgg.nivmr.cN
aeLwHMH.nivmr.cN
ZPzjIIY.nivmr.cN
PiEKhya.nivmr.cN
7K2lfg2.nivmr.cN
yqGkWDK.nivmr.cN
9KoyANA.nivmr.cN
iA0BNeZ.nivmr.cN
8QBFOWq.nivmr.cN
QNPOfZ7.nivmr.cN
1kcSo1x.nivmr.cN
kEaPY8R.nivmr.cN
xxlVjat.nivmr.cN
wJT9W9y.nivmr.cN
VqDJLMo.nivmr.cN
JlYFjaL.nivmr.cN
5XJfLGg.nivmr.cN
CJhS7en.nivmr.cN
PuKAuT9.nivmr.cN
NE3sJlS.nivmr.cN
UZOqvkS.nivmr.cN
5Yu3Dxy.nivmr.cN
HSZbbRT.nivmr.cN
bhGOsdb.nivmr.cN
SqS2YOn.nivmr.cN
MMZGOTr.nivmr.cN
B3nnAzT.nivmr.cN
JPzSJfo.nivmr.cN
2L7MziD.nivmr.cN
lbCfMlV.nivmr.cN
CYf6OHW.nivmr.cN
tKjob0m.nivmr.cN
sHu5wQy.nivmr.cN
tbLArk8.nivmr.cN
euPWR8N.nivmr.cN
yEVDF37.nivmr.cN
mDkWj1k.nivmr.cN
jWteyHM.nivmr.cN
02iehZe.nivmr.cN
At08mSX.nivmr.cN
HOeCSYX.nivmr.cN
CsrKsMb.nivmr.cN
d795uhF.nivmr.cN
bFzE3Qq.nivmr.cN
L2vvyVO.nivmr.cN
g5ij5xK.nivmr.cN
VMUXA87.nivmr.cN
pG5zvyx.nivmr.cN
uGC9Mz4.nivmr.cN
QY4tEL0.nivmr.cN
6MzyQXY.nivmr.cN
kuyQpJW.nivmr.cN
njpGQw4.nivmr.cN
s8sXsd9.nivmr.cN
b5OpQ1X.nivmr.cN
vjYsoIY.nivmr.cN
l13qmYv.nivmr.cN
L0xPqgg.nivmr.cN
80LxbaM.nivmr.cN
a0B4G9G.nivmr.cN
cj7Go3a.nivmr.cN
WdjBDRD.nivmr.cN
RxB1r0E.nivmr.cN
lERL6OW.nivmr.cN
jOArnVE.nivmr.cN
3j7vAhv.nivmr.cN
UfI5A3E.nivmr.cN
MVlzg1N.nivmr.cN
puruYe8.nivmr.cN
7AqjuLt.nivmr.cN
214gEzE.nivmr.cN
YqxhmaV.nivmr.cN

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询