为啥 Join()-ing 限制为 64 的 Split() 返回超过 64 个子字符串?

Posted

技术标签:

【中文标题】为啥 Join()-ing 限制为 64 的 Split() 返回超过 64 个子字符串?【英文标题】:Why does Join()-ing a Split() with limit 64 return more than 64 substrings?为什么 Join()-ing 限制为 64 的 Split() 返回超过 64 个子字符串? 【发布时间】:2015-07-01 11:27:39 【问题描述】:

我必须将一个字符串限制为最多 64 个子字符串,这些子字符串除以;。输入字符串包含 113 个子字符串:

x2BlackList = "mcc=206,mnc=1,mncLength=2,enbId=180096;mcc=206,mnc=1,mncLength=2,enbId=80459;mcc=206,mnc=1,mncLength=2,enbId=84604;mcc=206,mnc=1,mncLength=2,enbId=180166;mcc=206,mnc=1,mncLength=2,enbId=80279;mcc=206,mnc=1,mncLength=2,enbId=80288;mcc=206,mnc=1,mncLength=2,enbId=80457;mcc=208,mnc=10,mncLength=2,enbId=4791;mcc=206,mnc=1,mncLength=2,enbId=80197;mcc=206,mnc=1,mncLength=2,enbId=80188;mcc=206,mnc=1,mncLength=2,enbId=80195;mcc=206,mnc=1,mncLength=2,enbId=80206;mcc=206,mnc=1,mncLength=2,enbId=181309;mcc=206,mnc=1,mncLength=2,enbId=181218;mcc=206,mnc=1,mncLength=2,enbId=180254;mcc=206,mnc=1,mncLength=2,enbId=80332;mcc=206,mnc=1,mncLength=2,enbId=180340;mcc=206,mnc=1,mncLength=2,enbId=83355;mcc=206,mnc=1,mncLength=2,enbId=180367;mcc=206,mnc=1,mncLength=2,enbId=181222;mcc=206,mnc=1,mncLength=2,enbId=83887;mcc=206,mnc=1,mncLength=2,enbId=181026;mcc=206,mnc=1,mncLength=2,enbId=180356;mcc=206,mnc=1,mncLength=2,enbId=181001;mcc=206,mnc=1,mncLength=2,enbId=84624;mcc=206,mnc=1,mncLength=2,enbId=80209;mcc=206,mnc=1,mncLength=2,enbId=80318;mcc=206,mnc=1,mncLength=2,enbId=80454;mcc=206,mnc=1,mncLength=2,enbId=80471;mcc=206,mnc=1,mncLength=2,enbId=80476;mcc=206,mnc=1,mncLength=2,enbId=80486;mcc=206,mnc=1,mncLength=2,enbId=80526;mcc=206,mnc=1,mncLength=2,enbId=80445;mcc=206,mnc=1,mncLength=2,enbId=80586;mcc=206,mnc=1,mncLength=2,enbId=80212;mcc=206,mnc=1,mncLength=2,enbId=80189;mcc=206,mnc=1,mncLength=2,enbId=80453;mcc=206,mnc=1,mncLength=2,enbId=80474;mcc=206,mnc=1,mncLength=2,enbId=80191;mcc=206,mnc=1,mncLength=2,enbId=181230;mcc=206,mnc=1,mncLength=2,enbId=181394;mcc=206,mnc=1,mncLength=2,enbId=181401;mcc=206,mnc=1,mncLength=2,enbId=83338;mcc=206,mnc=1,mncLength=2,enbId=83395;mcc=206,mnc=1,mncLength=2,enbId=83415;mcc=206,mnc=1,mncLength=2,enbId=180381;mcc=206,mnc=1,mncLength=2,enbId=80180;mcc=206,mnc=1,mncLength=2,enbId=80196;mcc=206,mnc=1,mncLength=2,enbId=80484;mcc=206,mnc=1,mncLength=2,enbId=80204;mcc=206,mnc=1,mncLength=2,enbId=80464;mcc=206,mnc=1,mncLength=2,enbId=80314;mcc=206,mnc=1,mncLength=2,enbId=84580;mcc=206,mnc=1,mncLength=2,enbId=80520;mcc=206,mnc=1,mncLength=2,enbId=83387;mcc=206,mnc=1,mncLength=2,enbId=83376;mcc=206,mnc=1,mncLength=2,enbId=83397;mcc=206,mnc=1,mncLength=2,enbId=83439;mcc=206,mnc=1,mncLength=2,enbId=80324;mcc=206,mnc=1,mncLength=2,enbId=180094;mcc=206,mnc=1,mncLength=2,enbId=80291;mcc=206,mnc=1,mncLength=2,enbId=80293;mcc=206,mnc=1,mncLength=2,enbId=80297;mcc=206,mnc=1,mncLength=2,enbId=80299;mcc=206,mnc=1,mncLength=2,enbId=80307;mcc=206,mnc=1,mncLength=2,enbId=80458;mcc=206,mnc=1,mncLength=2,enbId=80473;mcc=206,mnc=1,mncLength=2,enbId=80502;mcc=206,mnc=1,mncLength=2,enbId=80517;mcc=206,mnc=1,mncLength=2,enbId=80540;mcc=206,mnc=1,mncLength=2,enbId=80583;mcc=206,mnc=1,mncLength=2,enbId=83815;mcc=206,mnc=1,mncLength=2,enbId=83818;mcc=206,mnc=1,mncLength=2,enbId=83823;mcc=206,mnc=1,mncLength=2,enbId=83834;mcc=206,mnc=1,mncLength=2,enbId=84006;mcc=206,mnc=1,mncLength=2,enbId=84018;mcc=206,mnc=1,mncLength=2,enbId=84594;mcc=206,mnc=1,mncLength=2,enbId=84605;mcc=206,mnc=1,mncLength=2,enbId=84610;mcc=206,mnc=1,mncLength=2,enbId=180514;mcc=206,mnc=1,mncLength=2,enbId=180519;mcc=206,mnc=1,mncLength=2,enbId=180523;mcc=206,mnc=1,mncLength=2,enbId=180528;mcc=206,mnc=1,mncLength=2,enbId=180530;mcc=206,mnc=1,mncLength=2,enbId=180611;mcc=206,mnc=1,mncLength=2,enbId=180612;mcc=206,mnc=1,mncLength=2,enbId=180616;mcc=206,mnc=1,mncLength=2,enbId=180618;mcc=206,mnc=1,mncLength=2,enbId=180619;mcc=206,mnc=1,mncLength=2,enbId=180620;mcc=206,mnc=1,mncLength=2,enbId=180623;mcc=206,mnc=1,mncLength=2,enbId=180625;mcc=206,mnc=1,mncLength=2,enbId=180629;mcc=206,mnc=1,mncLength=2,enbId=180814;mcc=206,mnc=1,mncLength=2,enbId=181254;mcc=206,mnc=1,mncLength=2,enbId=181275;mcc=206,mnc=1,mncLength=2,enbId=181466;mcc=206,mnc=1,mncLength=2,enbId=181482;mcc=206,mnc=1,mncLength=2,enbId=181648;mcc=206,mnc=1,mncLength=2,enbId=181737;mcc=234,mnc=10,mncLength=2,enbId=504599;mcc=234,mnc=10,mncLength=2,enbId=504699;mcc=234,mnc=10,mncLength=2,enbId=505533;mcc=234,mnc=10,mncLength=2,enbId=505559;mcc=234,mnc=10,mncLength=2,enbId=505563;mcc=234,mnc=10,mncLength=2,enbId=505627;mcc=234,mnc=10,mncLength=2,enbId=505711;mcc=234,mnc=10,mncLength=2,enbId=505805;mcc=234,mnc=10,mncLength=2,enbId=506130;mcc=234,mnc=10,mncLength=2,enbId=506624;mcc=234,mnc=10,mncLength=2,enbId=506752;mcc=234,mnc=10,mncLength=2,enbId=506888"

使用Split我可以将子串的数量限制为64:

Dim List() As String, _
    Item As Variant, _
    Counter As Long
Counter = 0
List = Split(x2BlackList, ";", 64)
For Each Item In List
    Counter = Counter + 1
Next
Debug.Print Counter

调试窗口显示计数为 64 个元素。使用Join我想把这64个元素放到一个字符串中,;作为分隔符:

NewBlackList = Join(List, ";")
Debug.Print NewBlackList

NewBlackList 包含所有 113 个子字符串。我试过上面的代码,也试过下面的简化版本(我更喜欢使用),但两者都不将字符串限制为 64 个子字符串。

SetBlackList = Join(Split(x2BlackList, ";", 64), ";")

为什么Join()ing a Split(,,64) 返回超过 64 个子字符串?

【问题讨论】:

【参考方案1】:

Split() 函数的第三个参数对返回的元素数量进行了限制。但是,这并不意味着丢失了更多元素。它们都在最后一个元素中未拆分返回。

因此,您将字符串拆分为最多 64 个子字符串。在这种情况下,第 64 个元素是元素 64 到 113 的未拆分值。

当你在结果数组上运行Join() 时,你会得到原来的字符串。

你需要做的是Split()这个字符串然后丢弃你不想要的元素:

List = Split(x2BlackList, ";")

If UBound(List) > 63 Then
    ReDim Preserve List(63)
End If

NewBlackList = Join(List, ";")

【讨论】:

以上是关于为啥 Join()-ing 限制为 64 的 Split() 返回超过 64 个子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

生产环境为啥尽量不用join

2022最新超详细Spring全家桶面试题(待更新ing)

输入框输入限制为1-64个字符,这个输入框能输入多少个汉字?

为啥 WPA2-PSK 密钥长度限制为 63 个字符?

由 INNER JOIN-ing 3 个表产生的记录集不可更新

将 MySQL join 返回的结果限制为 1