1、System.String类中的方法
方法 作用 Compare 比较字符串的内容,考虑区域值背景 CompareOrdinal 与Compare一样,但不考虑区域值背景 Concat 把多个字符串实例合并为一个实例 CopyTo 从选定下标开始的特定数量字符复制到数组的一个全新实例中 Format 格式化包含各种值的字符串和如何格式化每个值的说明符 IndexOf 定位字符串中第一次出现某个给定子字符串或字符的位置 IndexOfAny 定位字符串中第一次出现某个字符或一组字符的位置 Insert 把一个字符串实例插入到另一个字符串实例的指定索引处 Join 合并字符串数组,创建一个新字符串 LastIndexOf 与IndexOf一样,但定位最后一次出现的位置 LastIndexOfAny 与IndexOfAny一样,但定位最后一次出现的位置 PadLeft 在字符串的左侧,通过添加指定的重复字符填充字符串 PadRight 在字符串的右侧,通过添加指定的重复字符填充字符串 Replace 用另一个字符或字符串替换字符串中给定的字符或子字符串 Split 在出现给定字符的地方,把字符串拆分为一个子字符串数组 Substring 在字符串中检索给定位置的子字符串 ToLower 把字符串转换为小写形式 ToUpper 把字符串转换为大写形式 Trim 删除首尾的空白
2、string与StringBuilder
- 1、string的缺点是字符串变量的内容发生改变时,都需要重新分配内存。假如,要创建一个迭代10000次的循环,每次迭代都会将一个新的字符连接到字符串,这样内存中就会有10000个字符串,每个字符串与前一个字符串仅有一个字符的区别,但性能影响是很大的。
- 2、StringBuilder通过分配一个缓存,来解决这个问题。对于字符串的修改就在赋予StringBuilder实例的内存块中进行,大大提高了追加字符串和替换单个字符的效率。
3、StringBuilder成员
构造函数
参数是一个初始字符串和该字符串的容量
var sb = new StringBuilder("Hello World!", 20);
只提供一个字符串
var sb = new StringBuilder("Hello World!");
创建一个给定容量的空StringBuilder类
var sb = new StringBuilder(20);
属性
- Length:指定包含字符串的实际长度;
- Capacity:指定字符串在分配的内存中的最大长度;
- MaxCapacity:对给定的StringBuilder实例的容量限制(只读属性)。
4、StringBuilder类的方法
方法 说明 Append 给当前字符串追加一个字符串 AppendFormat 追加特定格式的字符串 Insert 在当前字符串中插入一个子字符串 Remove 从当前字符串中删除字符 Replace 在当前字符串中,用某个字符全部替换另一个字符,或者用当前字符串中的一个子字符串全部替换另一个字符串 ToString 返回当前强制转换为System.String对象的字符串
5、字符串插值
C#6引入了给字符串使用 前缀的字符串插值。这个前缀允许在花括号中包含占位符来引用代码的结果。在现实中,这只是语法糖,对于带 前 缀 的 字 符 串 插 值 。 这 个 前 缀 允 许 在 花 括 号 中 包 含 占 位 符 来 引 用 代 码 的 结 果 。 在 现 实 中 , 这 只 是 语 法 糖 , 对 于 带 前缀的字符串,编译器创建String.Format方法的调用。
string s1 = "World"; string s2 = $"Hello, {s1}"; //第二句话等价于 string s2 = String.Format("Hello, {0}", s1);
- FormattableString
把字符串赋予FormattableString,就很容易得到翻译过来的插值字符串。这个类型定义了Format属性(返回得到的格式字符串)、ArgumentCount属性和方法GetArgument(返回值)。
> int x = 3, y = 4;
> FormattableString s = $"The result of {x} + {y} is {x + y}";
> WriteLine($"format:{s.Format}");
> for (int i = 0; i < s.ArgumentCount; i++)
> {
> WriteLine($"argument {i}: {s.GetArgument(i)}");
> }
>
程序运行结果:
- format:The result of {0} + {1} is {2}
- argument 0: 3
- argument 1: 4
- argument 2: 7
- 转义花括号
如果希望在插值字符串中包括花括号,就可以使用两个花括号转义。
> WriteLine($"{{s}} displays the value of s: {s}");
>
6、日期时间和数字的格式
除了给占位符使用字符串格式之外,还可以根据数据类型使用特定的格式。在占位符中,格式字符串跟在表达式的后面,用冒号隔开。
//用大写字母D表示长日期格式字符串,用小写字母d表示短日期字符串 var day = new DateTime(); WriteLine($"{day:D}"); WriteLine($"{day:d}");
标准数字格式字符串
- n:用组分隔符显示整数和小数;
- e:用指数表示;
- x:转换为十六进制;
- c:显示货币;
- #:是数字占位符,如果数字可用,就显示数字;数字不可用,就不显示;
- 0:是零占位符,显示相应的数字,如果数字不存在,就显示零。
7、自定义字符串格式
可以为自己的类型创建自定义格式字符串。为此,需要实现接口IFormattable。该接口定义了带两个参数的ToString方法:一个是格式的字符串参数,另一个是IFormatProvider参数。
8、正则表达式的功能
- 1、一组用于标识特殊字符类型的转义代码。例如DOS命令中使用*字符表示任意子字符串。
- 2、一个系统,在搜索操作中把子字符串和中间结果的各个部分组合起来。使用正则表达式,可以对字符串执行许多复杂而高级的操作,例如:
- 识别(可以是标记或删除)字符串中所有重复的单词;
- 把所有单词都转换为标题格式(首字母大写);
- 把长于3个字符的所有单词都转换为标题格式;
- 确保句子有正确的大写形式;
- 区分URI的各个元素(例如,给定http://www.wrox.com,提取出其中的协议、计算机名和文件名等)。
9、Regex类(模式就是搜索字符串中的指定内容)
Regex类的静态方法Matches()。这个方法的参数是一些输入文本、一个模式和从RegexOptions枚举中提取的一组可选标志。
static void Find1(string text) { const string pattern = @"\bion"; MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); foreach (Match matche in matches) { WriteLine(matche.Index); } }
10、表达式的写法
- 转义序列:都是以”\”开头的,所以我们要在前面加上@符号。
- 方括号:匹配包含方括号中的字符;例如,ma[n|p],就是搜素map和man;[A-E],表示A-E之间的所有大写字母(包括A和E);[0-9]表示一个数字;[0-9]+表示搜索一个只包含0-9的整数,675,9都是可以的。
- 元字符:
.
表示出了换行符以外的任何单个字符,而\.
表示一个点。
11、正则表达式组合字符
正则表达式的一个优秀特性就是可以把字符组合起来。在正则表达式模式中,可以把任何字符组合起来,像处理单个字符那样处理它们。但是,要使用圆括号,得到的序列称为一组。例如,模式(an)+定位任意重复出现的序列an。如果应用到”bananas came to Europe late in the annals of history”上,就会从bananas中识别出anan。这里没有把其中一个an作为匹配结果,因为匹配结果不能重复,如果有重叠,在默认情况下就选择最长的匹配序列。
:,
- URL的格式是://
例如:http://www.wrox.com:80,就可以使用下面的表达式:\b(http?)(://)([.\w]+)([\s:([\d]{2,5})?)\b
- (http?):会识别http或https协议;
- (://):仅指定字符://;
- ([.\w]+):该表达式要么是句点符号,要么是用\w指定的任意字母数字字符。这些字符可以重复多次;
- ([\s:([\d]{2,5})?):\s指定空白字符或冒号,内部组[\d]指定一个数字,表达式{2,5}指定前面的字符(数字)允许至少出现两次但不超过5次。