黑马程序员:C#基础篇(六)String与正则表达式

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


String类

string类定义了非常多的方法来操作实例。

        static void Main(string[] args)
        {
            char[]chs={'1','a','d','f','g'};//直接用初始化器初始化
            string str = new string(chs);
            string str1 = new string(chs, 1, chs.Length - 1);
            string str2 = new string('a', 5);
            int num = str.CompareTo(str2);//比较看实例排序顺序是位于之前还是之后
            bool b = str.Contains(str);//看str2是否出现在str中,我猜测用到了正则表达式匹配
            b = str.EndsWith(str2);//匹配最后一个字符
            b = str.Equals(str1);//
            str.GetEnumerator();//实现的IEnumerable接口的方法,用于支持迭代
            num = str.IndexOf("s", 0);//获取第一个匹配项的索引,-1就是没有匹配到
            num = str.IndexOfAny(chs);//同上,只不过匹配项是数组中的任意一个
            num = str.LastIndexOf('s', 0);//同上,最后一个匹配项的索引
            num = str.LastIndexOfAny(chs);//同上
            str = str.Insert(str.Length-1,"faf");//在指定位置插入一个字符串构成新字符串返回
            num = str.Length;//实例中字符长度
            str.PadLeft(num, '我');//在左侧填充num个字符
            str.PadRight(num, '你');//同上
            str = str.Remove(0, 3);//指定位置开始算起,删除3个字符,注意不要超出索引
            str = str.Replace("s", "asd");//替换提供的匹配项为
            string[]strs = str.Split(new char[] { 'a', ' ' });//用提供的值等信息分割
            b = str.StartsWith("sdaf");//看第一个字符是否相匹配
            str = str.Substring(0, str.Length-1);//获取子字符串
            chs = str.ToCharArray();//转换成字符数组
            str = str.ToLower();//
            str = str.ToUpper();//
            str = str.Trim('s', 'a');//去除一组字符的所有首尾匹配项,不加参数是去除空格
            str.TrimEnd('s');//同上
            str.TrimStart('s');//同上
            str = string.Concat("saa", "afw");//连接实例
            string str3 = string.Empty;
            b = string.IsNullOrEmpty(str);
            b = string.IsNullOrWhiteSpace(str3);
            str = string.Intern(str);//检索引用
            str = string.Join("s", new string[] { "223", "q2r5", "q3r5" });
            str = string.Join<int>("123", new int[] { 1, 1, 2, 34, 5 });
            str = string.Format("Format"); //Console.WriteLine();就是调用了一个格式字符串

格式字符串就是用给定的格式来输出字符,这个格式可以自定义,当然也有预定义好的。注意,处理不了的会有异常。

C 或c,货币。 默认是小数点后两位,有时候后面跟个数字,比如C3,就是小数点后三位的意思。不同的文化设置,前面的货币符号是不同的。

D或d,十进制整数。D后面加数字表示位数,不足左边补零。

X或x,十六进制。

            str = string.Format("{0:c3}",123.353736);
            str = string.Format("{0:D8}",10000);
            str = string.Format("{0:x}", 10000);

如果是大量的字符串连接,可以用StringBuild类。

 

正则表达式

说到字符串,不得不说正则表达式,简单点说,正则表达式就是字符串,用来匹配特定的字符串。

C#中支持的元字符:

\d 匹配一个数字,相当于[0-9]

\D 匹配非数字,相当于[^0-9]

\w 匹配字母和数字,相当于[A-Za-z0-9]

\W 大写取小写的反义,[^A-Za-z0-9]

\b 匹配一个\w字符序列的开始或结束的位置

\B 同上取反

\t 匹配一个制表符

\n 匹配一个换行符

\s 匹配一个空白符

\S 匹配一个非空白符

[...] 匹配子字符串中指定的任意一个字符(三个点代表子字符串)

[^...] 匹配为指定的任意一个字符

^ 如果设置了MultiLine选项,匹配每一行中首字符前的位置,否则匹配字符串首字符前的位置

$ 如果设置了MultiLine选项,匹配每一行中尾字符后的位置,否则匹配字符串尾字符后的位置

\A  匹配字符串首字符前的位置,不受MultiLine影响

\Z  匹配字符串尾字符后的位置,不受MultiLine影响

\G 指定匹配之间必须是连续的

?限定符,匹配前面的字符或组的零个或一个实例

*  限定符,匹配前面的字符或组的零个或多个实例

+ 限定符,匹配前面的字符或组的一个或多个实例

{n} 限定符,匹配前面的字符或组的n个实例

{n,m} 限定符,匹配前面的字符或组的最少n个,最多m个实例

$number 代替与组号为number的组匹配的最后一个子字符序列

${name} 代替与组名为name的组匹配的最后一个子字符序列

补充说明:

(1)C#中 . 可以表示任意一个字符

(2)用 | 可以表示或的关系

(3)由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,C#中可以用 \ 转义,例如希望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+  

 写一个匹配邮箱的例子:

    class Program
    {
        static void Main(string[] args)
        {
            string html = File.ReadAllText("mail.txt",Encoding.Default);
            Regex rg = new Regex(@"\w+@\w+(.\w)+");//简单匹配下
            MatchCollection mc = rg.Matches(html);
            StringBuilder sb = new StringBuilder();
            foreach (Match item in mc)
            {
                sb = sb.AppendLine(item.Value);
            }
            File.WriteAllText("mails.txt",sb.ToString());
        }
    }

关于分组,上面匹配邮箱的正则表达式就用了一个分组,用item.Groups.Value可以获得组里面的数据,还可以获得索引等信息。组序号从1开始,为0的组就是item本身。

关于贪婪模式,简单点说就是尽可能的向后匹配,例子:

            string str=@"<html align=""center""><p>123</p></html>";
            Regex rg = new Regex("<.+>");
            MatchCollection mc = rg.Matches(str);
            Console.WriteLine(mc.Count);
            foreach (Match item in mc)
            {
                Console.WriteLine(item.Value);
            }
            Console.ReadKey();

很明显,上例中就发生了贪婪模式,最后只有一个匹配项,从头到尾,如果我想匹配每一对括号,“<.+>”肯定不行,会发生贪婪模式,如何取消贪婪模式呢?在限定符后面加问号?就行。注意别写成中文问号?了。上例把正则表达式改为“<.+?>”就不会发生贪婪模式了,会匹配到4项。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值