第十章:字符串和正则表达式

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次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值