“;为什么";字符串后面.字符串末尾为空
本文关键字:字符串 quot 为什么 | 更新日期: 2023-09-27 17:58:32
背景
我使用的是一个分隔字符串,当我注意到数组中的最后一个点是""
时,我正在使用string.Split将每个子字符串放入一个数组中。由于我在数组的最后一个索引处寻找特定的子字符串,我最终看到了这篇文章,解释了所有字符串都以string.Empty
结尾。
示例
以下显示了此行为的实际操作。当我拆分句子并将每个子字符串写入控制台时,我们可以看到最后一个元素是空字符串:
public class Program
{
static void Main(string[] args)
{
const string mySentence = "Hello,this,is,my,string!";
var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.None);
foreach (var word in wordArray)
{
var message = word;
if (word == string.Empty) message = "Empty string";
Console.WriteLine(message);
}
Console.ReadKey();
}
}
问题&"修复"
从概念上讲,每个字符之间都有空字符串,但为什么String
即使在字符串的末尾也会这样呢?"ABC"
等价于"ABC" + ""
或ABC + "" + "" + ""
,这似乎令人困惑,那么为什么不将字符串字面上视为仅"ABC"
呢?有一个"修复"它,以获得我想要的"真正的"子字符串:
public class Program
{
static void Main(string[] args)
{
const string mySentence = "Hello,this,is,my,string!";
var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.None);
var wordList = new List<string>();
wordList.AddRange(wordArray);
wordList.RemoveAt(wordList.LastIndexOf(string.Empty));
foreach (var word in wordList)
{
var message = word;
if (word == string.Empty) message = "Empty string";
Console.WriteLine(message);
}
Console.ReadKey();
}
}
但我仍然不明白为什么字符串的末尾会被用同样的行为处理,因为后面没有其他需要空字符串的字符。它对编译器有什么作用吗?
空字符串是字符串的0
。它们无处不在。
很自然,"ABC"等同于"ABC"+"或ABC+"+""+"。就像3等于3+0或3+0+0+0是很自然的。
事实上,在"Hello,this,is,my,string!".Split('!')之后有一个空字符串,这意味着你的字符串以"!"
之所以会发生这种情况,是因为您使用的是StringSplitOptions.None
,而其中一个分隔符值出现在字符串的末尾。该选项的全部目的是创建您正在观察的行为:它将包含N个分隔符的字符串拆分为N+1个片段。
要查看您想要的行为,请使用StringSplitOptions.RemoveEmptyEntries
:
var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.RemoveEmptyEntries);
至于为什么你看到了你所看到的。StringSplitOptions.None
的行为是找到输入字符串中分隔符所在的所有位置,并返回分隔符前后的每个片段的数组。这可能很有用,例如,如果您正在解析一个字符串,您知道该字符串正好有N个部分,但其中一些部分可能是空的。因此,例如,在逗号分隔符上拆分以下内容,它们将分别产生正好3个部分:
a,b,c
a,b,
a,,c
a,,
,b,c
,b,
,,c
,,
如果您想在分隔符之间允许空值,但不允许在开始或结束时使用,您可以在拆分之前剥离字符串开始或结束处的分隔符:
var wordArray = Regex
.Replace(mySentence, "^[,!]|[,!]$", "")
.Split(new[] {",", "!"}, StringSplitOptions.None);
""
是Hello,this,is,my,string!
的每个字母之间的间隙,因此当字符串被,
和!
分割时,结果是Hello
、this
、is
、my
、string
、""
。""
是字符串末尾和!
之间的空字符。
如果将""
替换为可见字符(例如#
),则字符串将类似于此#H#e#l#l#o#,#t#h#i#s#,#i#s#,#m#y#,#s#t#r#i#n#g#!#
。