目录
一、概念
首先了解下字符的定义:
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。字符是电子计算机或无线电通信中字母、数字、符号的统称,其是数据结构中最小的数据存取单位,通常由8个二进制位(一个字节)来表示一个字符。
字符是计算机中经常用到的二进制编码形式,也是计算机中最常用到的信息形式。根据计算机的编码方式不同,字符在不同编码方式的存储所占用字节数也不同。字符串,多个字符拼接物。
二、关键性质
不变性:
一般情况下,我们将“一经赋值,其值就不能被更改”视为不变性,字符串的不变性就是指,字符串一经赋值,其值就不能被更改,当通过代码使字符串变量等于一个新的值的时候,堆上会出现一个新的字符串,然后,栈上的变量指向新的字符串,无法更改原来字符串的值
三、String == null和""的区别
string str1 ="";
空字符串,定义一个string的引用并且分配内存空间string str2 = null;
定义一个string的引用,只在栈上分配了空间,在堆上没有分配,直接使用该变量会报空引用错误
四、StringBuilder
要修改字符串而不是创建新的对象可用,StringBuilder可以自由扩展大小,String分配在栈区,StringBuilder分配在堆区
StringBuilder sb = new StringBuilder(长度);
当指定分配大小之后,性能就会得到提升。在达到容量之前,它不会为其自己重新分配空间。如果超过指定大小系统会当前大小倍增
五、常用方法
当然,以下是根据您提供的列表,重新排版并添加了C#语言示例的常用字符串处理方法。
一、Object 到 String
-
ToString()
object obj = null; try { string str = obj.ToString(); // 如果obj为null,这里会抛出NullReferenceException } catch (NullReferenceException ex) { Console.WriteLine("对象为空"); }
-
obj + “”
string str = obj?.ToString() ?? ""; // 使用null条件运算符来安全地转换为字符串,如果为null则返回""
二、字符串拼接
-
+
string str1 = "Hello, "; string str2 = "World!"; string str3 = str1 + str2; // 结果:"Hello, World!"
-
string.Format()
string str4 = string.Format("{0}, {1}", str1, str2); // 结果:"Hello, , World!"
-
string.Concat()
string str5 = string.Concat("11", "aa"); // 结果:"11aa"
三、判断字符串是否为""、null
-
直接比较
if (str == "" || str == null) { Console.WriteLine("字符串为空或为null"); }
-
IsNullOrEmpty()
if (string.IsNullOrEmpty(str)) { Console.WriteLine("字符串为空或为null"); }
-
IsNullOrWhiteSpace()
if (string.IsNullOrWhiteSpace(str)) { Console.WriteLine("字符串为空、为null或仅包含空白字符"); }
四、Substring(),截取字符串
-
Substring(int startIndex)
string substr = "Hello, World!".Substring(7); // 结果:"World!"
-
Substring(int startIndex, int length)
string substr2 = "Hello, World!".Substring(7, 5); // 结果:"World"
五、Replace(),替换字符串
-
Replace(Char first, Char second)
string replaced = "Hello, World!".Replace('l', 'L'); // 结果:"HeLLo, WorLd!"
-
Replace(String firstString, String secondString)
string replaced2 = "Hello, World!".Replace("World", "C#"); // 结果:"Hello, C#!"
六、Split(),字符串转成字符串数组
string[] words = "Hello, World!, C#!".Split(new char[] { ',', '!' }, StringSplitOptions.RemoveEmptyEntries);
// 结果:["Hello", " World", " C#"]
七、Join(),字符串数组转字符串
string result = string.Join(", ", words); // 结果:"Hello, World, C#"
八、ToLower() 、ToUpper(),大小写转换
-
ToLower() 字符串转成小写
string lower = "HELLO".ToLower(); // 结果:"hello"
-
ToUpper() 字符串转成大写
string upper = "hello".ToUpper(); // 结果:"HELLO"
九、Trim() 、TrimEnd() 、TrimStart()
-
Trim() 从当前字符串的开头和结尾删除所有空白字符后剩余的字符串
string trimmed = " Hello, World! ".Trim(); // 结果:"Hello, World!"
-
TrimEnd() 去掉字符串末尾出现的字符或字符数组
string trimmedEnd = "Hello, World!!!".TrimEnd('!'); // 结果:"Hello, World"
-
TrimStart() 去掉头部出现的字符或字符数组
string trimmedStart = " Hello, World!".TrimStart(); // 结果:"Hello, World!" // 如果需要去除特定字符,如空格 string trimmedSpacesStart = " Hello, World!".TrimStart(' '); // 结果:"Hello, World!"
十、判断字符串是否包含指定字符串
-
Contains() 字符串是否包含指定的字符串
string str = "Hello, World!"; bool containsHello = str.Contains("Hello"); // 结果:true bool containsCsharp = str.Contains("C#"); // 结果:false
-
IndexOf() 返回指定字符串在字符串中的位置
int indexHello = str.IndexOf("Hello"); // 结果:0 int indexCsharp = str.IndexOf("C#"); // 结果:-1,表示未找到
-
StartsWith() 字符串头部是否包含指定字符串
bool startsWithHello = str.StartsWith("Hello"); // 结果:true bool startsWithWorld = str.StartsWith("World"); // 结果:false
-
EndsWith() 字符串末尾是否包含指定字符串
bool endsWithExclamation = str.EndsWith("!"); // 结果:true bool endsWithHello = str.EndsWith("Hello"); // 结果:false
十一、字符串比较
-
Compare()
string str1 = "apple"; string str2 = "banana"; int result = string.Compare(str1, str2); // 结果:< 0,因为"apple"在字典序上小于"banana" //按照字典排序比较,当str1 > str2时,返回1;当str1 = str2时,返回0;当str1 < str2时,返回 - 1 if (result < 0) { Console.WriteLine(str1 + " comes before " + str2); } else if (result > 0) { Console.WriteLine(str1 + " comes after " + str2); } else { Console.WriteLine(str1 + " and " + str2 + " are the same"); }
-
Equals() 比较如果相等就返回true,否则返回false
bool areEqual = str1.Equals(str2, StringComparison.Ordinal); // 结果:false bool areEqualIgnoreCase = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); // 可以比较忽略大小写的版本
十二、字符串复制
string original = "abcdefg";
string copied = original.Substring(2, 4); // 从索引2开始,复制4个字符
// 结果:"cdef"
// 如果想要完全复制字符串,可以这样做:
string fullyCopied = original.Substring(0, original.Length);
// 结果:"abcdefg"
十三、字符串插入
使用StringBuilder
:
StringBuilder sb = new StringBuilder("abc");
sb.Insert(2, "12"); // 在索引2处插入"12"
string result = sb.ToString(); // 结果:"a12bc"
使用字符串连接(不是最高效的方法,特别是对于大量插入操作):
string s = "abc";
string result = s.Substring(0, 2) + "12" + s.Substring(2); // 结果:"a12bc"
五、字符串分解案列
需求:按照JSON文件对比机器命令id返回结果,把机器错误信息转义成中文,即数组里的数字,难点,数组里包含了个小数组,开头结尾不要
错误格式如:
0,{[[-2,3],[],[0],[],[],[21120],[21120]]},GetErrorID();
0,{[[85],[],[],[],[],[]]},GetErrorID();
但是没有错时,返回0,{[[],[],[],[],[],[]]},GetErrorID(); ,
会出现少掉前面那个数组,第一个数组为一类,其余为另一类
private string CauseShow(string id)
{
try
{
string[] s1 = id.Split(new char[] { '{', '}' }, StringSplitOptions.None);
string[] s2 = s1[1].Split(new char[] { ',' }, StringSplitOptions.None);
int Length = s2.Length;
string controllerStr = null;
string EndStr = null;
if (Length == 6)
{
for (int i = Length - 1; i > Length - 6; i--)
{
if ((i == Length - 1 && s2[Length - 1].Length > 3) || (s2[i].Length > 2 && !(i == Length - 1)))
{
string[] s = s2[i].Split(new char[] { '[', ']' }, StringSplitOptions.None);
string ss = null;
for (int j = 0; j < alarm_servo.Length; j++)
{
if (Convert.ToInt32(s[1].ToString()) == alarm_servo[j].id)
{
ss = alarm_servo[j].Zh_CN.description;
}
}
s2[i] = ss;
}
if (s2[i].Length == 2 || (s2[i].Length == 3 && i == Length - 1))
{
s2[i] = "";
}
if (i <= 0)
{
break;
}
}
string[] s3 = s1[1].Split(new char[] { ',', '[', ']' }, StringSplitOptions.None);
ArrayList s3List = new ArrayList();
for (int i = 2; i < s3.Length - 2; i++)
{
if (s3[i] != "")
{
s3List.Add(s3[i]);
}
else
{
break;
}
}
if (s3List.Count > 0)
{
for (int i = 0; i < s3List.Count; i++)
{
for (int j = 0; j < alarm_controller.Length; j++)
{
if (Convert.ToInt32(s3List[i].ToString()) == alarm_controller[j].id)
{
controllerStr += alarm_controller[j].Zh_CN.description;
if (!(i == s3List.Count - 1))
{
controllerStr += ",";
}
}
}
}
}
for (int i = Length - 1; i > Length - 5; i--)
{
if (s2[i] == "")
{
continue;
}
else
{
EndStr += s2[i] + ",";
}
}
}
else
{
for (int i = Length - 1; i > Length - 6; i--)
{
if ((i == Length - 1 && s2[Length - 1].Length > 3) || (s2[i].Length > 2 && !(i == Length - 1)))
{
string[] s = s2[i].Split(new char[] { '[', ']' }, StringSplitOptions.None);
string ss = null;
for (int j = 0; j < alarm_servo.Length; j++)
{
if (Convert.ToInt32(s[1].ToString()) == alarm_servo[j].id)
{
ss = alarm_servo[j].Zh_CN.description;
}
}
s2[i] = ss;
}
if (s2[i].Length == 2 || (s2[i].Length == 3 && i == Length - 1))
{
s2[i] = "";
}
if (i <= 0)
{
break;
}
}
string[] s3 = s1[1].Split(new char[] { ',', '[', ']' }, StringSplitOptions.None);
ArrayList s3List = new ArrayList();
for (int i = 2; i < s3.Length - 2; i++)
{
if (s3[i] != "")
{
s3List.Add(s3[i]);
}
else
{
break;
}
}
if (s3List.Count > 0)
{
for (int i = 0; i < s3List.Count; i++)
{
for (int j = 0; j < alarm_controller.Length; j++)
{
if (Convert.ToInt32(s3List[i].ToString()) == alarm_controller[j].id)
{
controllerStr += alarm_controller[j].Zh_CN.description;
if (!(i == s3List.Count - 1))
{
controllerStr += ",";
}
}
}
}
}
for (int i = Length - 1; i > Length - 5; i--)
{
if (s2[i] == "")
{
continue;
}
else
{
EndStr += s2[i] + ",";
}
}
}
}
}