字符串与正则表达式(C#)

字符串简介

字符串是由零个或多个字符组成的有限序列,是几乎所有编程语言中可以实现的非常重要和有用的数据类型。

字符串是“System.String”类的一个引用类型,但与其他引用类型不同的是,C#将字符串视为一个基本类型,可以声明为一个变量,并为其赋值。

字符串声明格式如下:

string 变量名="初始值";

字符串的操作

C#中提供了比较全面的字符串处理方法,很多函数都进行了封装,为用户的编程工作提供了很大的便利。“System.String”是最常用的字符串操作类,可以帮助开发者完成绝大部分的字符串操作功能,使用方便。

字符串的大小写转换

String类提供了方便转换字符串中所有字符大小写的方法ToUpper和ToLower。这两个方法没有输入参数,使用也非常简单。

编写程序,把“Hello”转换为“HELLO”,然后再变为小写形式“hello”。

using System;
namespace Project1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "Study hard and get up every day.";
            Console.WriteLine("大写字符串:"+str.ToUpper());
            Console.WriteLine("小写字符串:"+str.ToLower());
            char mychar = 'a';
            Console.WriteLine("大写字符:"+char.ToUpper(mychar));
            Console.WriteLine("小写字符:"+char.ToLower(mychar));
        }
    }
}

字符串的比较

比较字符串是指按照字典排序规则,判定两个字符的相对大小。按照字典排序规则,在一本英文字典中,出现在前面的单词小于出现 在后面的单词。在String类中,常用的比较字符串的方法包括Compare、CompareTo,以及Equals。

1、Compare

Compare方法是String类的静态方法,用于全面比较两个字符串对象,其中最常用的两种方法如下:

int Compare(string str1, string str2);

int Compare(string str1, string str2, bool value);

str1与str2代表要比较的两个字符串。如果返回的整数小于0,则说明str1小于str2;如果等于0,则说明str1等于str2;如果大于0,则说明str1大于str2。value是一个bool值,如果该值为true时,就会忽略大小写进行比较。

编写程序,使用Compare方法比较两个字符串。

using System;
namespace Project2
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Hello";
            string str2 = "Hi";
            string str3 = "HELLO";
            Console.WriteLine(string.Compare(str1, str2));
            Console.WriteLine(string.Compare(str1, str3, true));
        }
    }
}

运行结果如下:

-1
0

2、CompareTo

CompareTo方法将当前字符串对象与另一个对象做比较,其作用与Compare类似,返回值也相同。CompareTo与Compare相比,区别在于CompareTo不是静态方法,可以通过一个String对象调用;CompareTo没有重载形式,只能按照大小写敏感方式比较两个整串。

其语法格式如下:

public int CompareTo(string strB)

编写程序,使用CompareTo方法比较两个字符串。

using System;
namespace Project3
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "HELLO";
            string str2 = "Hello";
            Console.WriteLine(str1.CompareTo(str2));
        }
    }
}

3、Equals

Equals方法用于方便地判定两个字符串是否相同,有两种重载形式:

public bool Equals(string)

public static bool Equals(string str1,string str2)

如果两个字符串相等,Equals返回值为True;否则,返回False。

编写程序,使用Equals方法比较两个字符串。

using System;
namespace Project4
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Hello";
            string str2 = "Hi";
            Console.WriteLine(Equals(str1, str2));
            Console.WriteLine(str1.Equals (str2));
        }
    }
}

字符串的格式化

Format方法用于创建格式化的字符串以及连接多个字符串对象。Format方法也有多个重载形式,最常用的为:

public static string Format(string format,params object[] args);

其中,参数format()用于指定返回字符串的格式,而args为一系列变量参数。它的转换格式为:

string.format(要转换的格式,格式化的对象);

string.format(要转换的格式,格式化的对象一,格式化的对象二);

数值格式符
方法适用类型含义
C数字类型专用场合的货币值
D只用于整数类型一般整数
E数字类型科学计数法
F数字类型小数点后的位数固定
G数字类型一般整数
N数字类型通用场合数字格式
P数字类型百分数
X只用于整数类型十六进制格式

编写程序,通过字符串Format方法对5600进行格式化,并输出转换后的结果。

using System;
namespace Project5
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("字符串的格式化输出");
            string str = string.Format("默认格式:--{0}\n" + "使用C格式:{0:C}\n" +
                         "使用D格式:{0:D}\n" + "使用E格式:{0:E}\n" + "使用F格式:{0:F}\n" +
                         "使用G格式:{0:G1}\n" + "使用N格式:{0:N}\n" + "使用P格式:{0:P}\n" +
                         "使用X格式:{0:X}\n", 5600);
            Console.WriteLine(str);
        }
    }
}

运行结果如下:

字符串的格式化输出
默认格式:--5600
使用C格式:¥5,600.00
使用D格式:5600
使用E格式:5.600000E+003
使用F格式:5600.00
使用G格式:6E+03
使用N格式:5,600.00
使用P格式:560,000.00%
使用X格式:15E0

编写程序 ,将1~10按三位数输出。

using System;
namespace Project6
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("使用Format方法,将1~10之间按三位数输出:");
            for (int i = 1; i <= 10; i++)
            {
                string str = String.Format("{0:D3}", i);
                Console.WriteLine(str);
            }
        }
    }
}

运行结果如下:

使用Format方法,将1~10之间按三位数输出:
001
002
003
004
005
006
007
008
009
010

字符串的截取

String类提供了一个Substring方法,用于截取字符串中指定位置和指定长度的字符。

语法格式如下:

public string Substring (int startIndex, int length)

其中,参数startIndex表示字符串的起始位置的索引,参数length表示字符串中的字符数。

Substring方法也有两种重载格式:

字符串1.Substring(整数n);

该方法是将字符串1前n个长度的字符串截取掉,保留后面的字符串。

字符串1.Substring(整数n,整数m);

该方法是保留从字符串1第n个长度开始数m个长度的字符串。

这两个重载格式都返回一个新的字符串。

编写程序,截取一段字符串。

using System;
namespace Project7
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "0123456789";
            string s1 = str.Substring(3);
            Console.WriteLine(s1);
            string s2 = str.Substring(2, 5);
            Console.WriteLine(s2);
        }
    }
}

运行结果:

3456789
23456

字符串的分割

使用Split方法可以把一个完整的字符串,按照某个分隔符,分裂成一系列小的字符串。分割后返回的值是一个字符串数组。

Split有多个重载形式,最常用的形式为:

public string[] Split(params char[] separator);

其中,参数separator是一个字符数组,用于包含分隔符。

编写程序 ,对字符串进行分割。

using System;
namespace Project7
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "大家好%,欢迎=学习C#!";
            Console.WriteLine("原字符串为:\n"+str);
            Console.WriteLine("使用Split方法进行分割");
            char[] separator={'%',"="};
            string[] changeStr= str.Split(separator);
            foreach (string outstr in changeStr)
            {
                Console.Write(outstr);
            }
            Console.WriteLine();
        }
    }
}

运行结果:

字符串的合并

字符串分合并可以通过以下三种方法实现。

1、连接运算符“+”

String支持连接运算符“+”,可以方便地连接多个字符串。

2、Concat方法

Concat方法用于连接两个或多个字符串。Concat方法也有多个重载形式。最常用的为:

public static string Concat(params string[] values);

其中,参数values用于指定所要连接的多个字符串。该方法的调用格式为:

string.Concat(字符串1,字符串2,字符串3,...,字符串n);

3、Join方法

Join方法利用一个字符数组和一个分隔符串构造新的字符串,常用于把多个字符串连接在一起,并用一个特殊的符号来分隔开。

Join方法的常用形式为:

public static string Join(string separator, string[] values);

其中,参数separator为指定的分隔符,而参数values用于指定所要连接的多个字符串数组,该方法的调用格式如下:

string.Join(合并后的分隔符,字符串数组);

编写程序,将字符串用“-”字符进行连接。

using System;
namespace Project9
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "ABC";
            string str2 = "7752";
            string str3 = "#%$%";
            string newStr = string.Join("-", str1, str2, str3);
            Console.WriteLine(newStr);
        }
    }
}

运行结果:

字符串的插入与填充

1、插入字符串

String类提供了一个Insert方法,可以向一个字符串中的任意位置插入新元素。

其语法格式如下:

public string Insert(int startIndex, string value);

参数startIndex用于指定所要插入的位置,从0开始索引;参数value指定所要插入的字符串。

编写程序,使用Insert方法,补全字符串。

using System;
namespace Project10
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Hello,C";
            string insertStr = str1.Insert(7, "#");
            Console.WriteLine(insertStr);
        }
    }
}

运行结果:

2、填充字符串

String类提供了填充字符串的方法,PadRight和PadLeft。PadRight方法是在字符串的右侧进行字符填充,而PadLeft是在字符串的左侧进行填充。

其语法格式如下:

public string PadRight(int totalWidth, char paddingChar);

该方法的参数totalWidth用于指定填充后的字符长度,参数paddingChar用于指定所要填充的字符。

编写程序,使用PadRight和PadLeft方法,填充字符串。

using System;
namespace Project11
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "33";
            string str2 = "444";
            string str3 = "5555";
            Console.WriteLine("PadRight用来在字符串右侧的结尾处添加指定字符,以达到指定的总长度");
            string padRightStr = str1.PadRight(5, '*') + "\n" +
                str2.PadRight(5, '*') + "\n" + str3.PadRight(5, '*');
            Console.WriteLine(padRightStr);
            Console.WriteLine("PadLeft用来在字符串左侧的开头添加指定的字符,以达到指定的总长度");
            string padLeftStr = str1.PadLeft(5, '*') + "\n" +
                str2.PadLeft(5, '*') + "\n" + str3.PadLeft(5, '*');
            Console.WriteLine(padLeftStr);
        }
    }
}

运行结果:

字符串的删除

字符串的删除是通过Remove方法来实现的。

其语法格式如下:

public string Remove(int startIndex, int count)

该方法有两种删除字符串的方式:第一种是将字符串开始位置后的所有字符删除;第二钟是从一个字符串的指定位置开始,删除指定数量的字符。其中,参数startIndex用于指定开始删除的位置,从0开始索引;参数count指定删除的字符数量。

编写程序,通过Remove方法实现字符串的移除。

using System;
namespace Project12
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "abcd12345efg";
            string changeStr1 = str.Remove(4);
            Console.WriteLine("用一个参数实现Remove的结果:");
            Console.WriteLine(changeStr1);
            string changeStr2 = str.Remove(4, 5);
            Console.WriteLine("用两个参数实现Remove的结果:");
            Console.WriteLine(changeStr2);
        }
    }
}

运行结果

字符串的修剪

若想把一个字符串首尾处的一些特殊字符剪切掉,可以使用String的Trim方法,如去掉一个字符串首尾的空格等。而在C#中有三促修剪字符串的方法Trim、TrimStart、TrimEnd。

(1)Trim方法删除字符串首部和尾部的空格。

(2)TrimStart方法只删除字符串头部的空格。

(3)TrimEnd方法只删除字符串尾部的空格。

编写程序,对字符串进行修剪。

using System;
namespace Project13
{
    class Program
    {
        static void Main(string[] args)
        {
            //字符串的修剪通过Trim来实现
            string str = "     Hello-World     ";
            Console.WriteLine("原字符串是:*" + str + "*");
            Console.WriteLine("把空格修剪后是:*" + str.Trim() + "*");
            //修剪开始用TrimStart
            Console.WriteLine("修剪开始空格后是:*" + str.TrimStart() + "*");
            //修剪结束用TrimEnd
            Console.WriteLine("修剪结束空格后是:*" + str.TrimEnd() + "*");
        }
    }
}

运行结果:

Trim方法也是有参数的,其语法格式如下:

public string Trim(params char[] trimChars);

其中,参数trimChars数组包含指定要去年的字符,如果省略,则删除空格符号。

编写程序,将字符串“%#$#Hello-World@%”修剪为“Hello-World”。

using System;
namespace Project14
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "%#$#Hello-World@%";
            Console.WriteLine("修剪其他字符的方法:" + str.Trim('%', '#', '$', '@'));
        }
    }
}

运行结果:

字符串的复制

String类包括复制字符串方法Copy和CopyTo,可以完成对一个字符串及其一部分的复制操作。

1、Copy方法

如果想要把一个字符串复制到另一个字符数组中,可以使用String的静态方法Copy来实现。

其语法格式如下:

public string Copy(string str);

其中,参数str为需要复制的源字符串,方法返回目标字符串。

2、CopyTo方法

CopyTo方法可以实现Copy同样的功能,但功能更为丰富,可以复制字符串的一部分到一个字符数组中。另外,CopyTo不是静态方法。

其语法格式如下:

public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);

其中,参数sourceIndex为需要复制的字符起始位置,参数destination为目标字符数组,参数destinationIndex指定目标数组中的开始存放位置,而参数count指定要复制的字符个数。

编写代码,对字符串进行赋值。

using System;
namespace Project15
{
    class Program
    {
        static void Main(string[] args)
        {
            //Copy方法复制字符串
            //Copy方法是静态方法,
            //何为静态方法?就是关键字.方法名来进行引用,例如:string.Main()
            string str = "http://www.hao123.com";
            Console.WriteLine("Copy实现复制的结果:");
            string copyStr = string.Copy(str);
            Console.WriteLine(copyStr);

            //CopyTo是非静态方法
           // string copyToStr = str.CopyTo();
            Console.WriteLine("CopyTo实现复制的结果:");
            char[] mycharArray = new char[20];  //定义一个字符数组mycharArray,并为其分配20个字符的空间
            str.CopyTo(11, mycharArray, 0, 6);//CopyTo方法有一个参数是数组,用来存放复制好的字符串
            Console.WriteLine(mycharArray);  //所以,定义字符数组mycharArray,
                                             //11表示需要复制的字符的起始位置,
            //也就是从字符‘h’开始,指定目标数组中的开始存放位置,因此是0,指定要复制的字符个数。

        }
    }
}

运行结果:

Copy实现复制的结果:
http://www.hao123.com
CopyTo实现复制的结果:
hao123

字符串的替换

要替换一个字符串中的某个特定字符或者某个子串,可以使用Replace方法来实现。

语法格式为:

public string Replace(char oldChar, char newChar);

public string Replace(string oldChar, string newChar);

其中,参数oldChar和oldValue为待替换的字符和子串,而参数newChar和newValue为替换后的新字符和新子串。

编写程序,对一个字符串中的字符进行替换。

using System;
namespace Project16
{
    class Program
    {
        static void Main(string[] args)
        {
            string oldStr = "www.hao123";
            Console.WriteLine("替换前的字符串:"+oldStr);
            string newStr = oldStr.Replace('w', 'W');
            Console.WriteLine("替换后的字符串:"+newStr);
        }
    }
}

字符串的查找

字符串的查找是通过IndexOf和LastIndexOf两个方法实现的。

1、IndexOf

查找字符中指定字符或字符串首次出现的位置,并返回首索引值。

调用格式如下:

字符串 indexOf(要查找的字符或字符串);

2、LastIndexOf

在字符串中从后向前定位字符和字符串,并返回最后一次在所要查找的字符串中出现的位置。用法和IndexOf完全相同。

字符串.LastIndexOf(要查找的字符或字符串);

注意:这两种方法均返回一个整数,如果所要查找的字符串内不包含要查找的字符或字符串则返回一个负数。

编写程序,查找字符在字符串中的位置。

using System;
namespace Project17
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "Good morning, everyone.";
            //            0123456789ABCDEFG
            int str1 = str.IndexOf('g');//查找'g'在str中的索引值(位置)
            int str2 = str.IndexOf("morning");//查找"morning"的第一个字符在str中的索引值(位置)
            Console.WriteLine(str1+"\n"+str2);
            int str3 = str.LastIndexOf('d');
            Console.WriteLine(str3);
        }
    }
}

运行结果:

11
5
3

StringBuilder类

与String类相比,StringBuilder类可以实现动态字符串。此外,动态的含义是指在修改字符串时,系统不需要创建新的对象,不会重复开辟新的内存空间,而是直接在原StringBuilder对象的基础上进行修改。

StringBuilder类的定义

StringBuilder类位于命名空间System.Text中,使用时可以在文件头通过using语句引入该空间:

using System.Text;

声明StringBuilder对象需要使用new关键字,并可以对其进行初始化。

如果不使用using关键字在文件头引入System.Text命名空间,也可以通过空间限定来声明StringBuilder对象。

注意:在声明时,也可以不给出初始值,然后通过其方法进行赋值。

设置StringBuilder类的容量

虽然StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是用户可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前StringBuilder对象容纳的字符串长度混淆在一起。

在达到容量之前,它不会为自己重新分配空间。当到达容量时,将自动分配新的空间且容量翻倍。StringBuilder默认初始分配16个字符长度。

两种方式来设置一个StringBuilder对象的容量。

1、使用构造函数

StringBuilder构造函数可以接受容量参数。

2、使用Capacity读/写属性

Capacity属性指定StringBuilder对象的容量。

追加操作

追加一个StringBuilder是指将新的字符串添加到当前StringBuilder字符串的结尾处,可以使用Append和AppendFormat方法来实现这个功能。

1、Append方法

Append方法实现简单的追加功能,语法格式如下:

public StringBuilder Append(object value);

其中,参数value既可以是字符串类型,也可以是其它的数据类型。

2、AppendFormat方法

AppendFormat方法可以实现对追加部分字符串的格式化,可以定义变量的格式,并将格式化后的字符串追加在StringBuilder后面。语法格式如下:

StringBuilder AppendFormat(string format, params object[] args);

其中,args数组指定所要追加的多个变量。format参数包括格式规范的字符串,其中包括一系列用大括号括起来的格式字符。

编写程序,实现对字符串的追加操作。

using System;
using System.Text;
namespace Project18
{
    class Program
    {
        static void Main(string[] args)
        {
            //初始化StringBuilder类
            StringBuilder str = new StringBuilder("好好学习,天天向上!");  
            //追加对应的字符串
            Console.WriteLine("====================Append====================");
            Console.WriteLine(str.Append("英语:Study hard and get up every day"));
            //利用插入进行换行
            Console.WriteLine("====================Insert===================="); 
            Console.WriteLine(str.Insert(10,"\n"));
            //利用移除取消换行
            Console.WriteLine("====================Remove====================");
            Console.WriteLine(str.Remove(10,1));
            //替换“英语”为“翻译”
            Console.WriteLine("====================Replace==================="); 
            Console.WriteLine(str.Replace("英语","翻译"));
            Console.WriteLine("=================AppendFormat=================");
            int score = 95;
            Console.WriteLine(str.AppendFormat("英语成绩:{0:F}",score));
        }
    }
}

运行结果:

插入操作

StringBuilder的插入操作是指将新的字符串插入到当前的StringBuilder字符串的指定位置。可以使用StringBuilder类的Insert方法来实现这个功能。

其语法格式如下:

public StringBuilder Insert(int index, object value);

其中,参数index指定所要插入的位置,并从0开始索引。同Append一样,参数value并不只是可取字符串类型。

删除操作

可以使用Remove方法从当前StringBuilder中移除指定数量的字符,移除过程从指定索引位开始到给定的长度结束。

其语法格式如下:

public StringBuilder Remove(int startIndex, int length);

其中,参数startIndex指定所要删除的起始位置,其含义同Insert中的index相同;参数length指定所要删除的字符数量。

替换操作

使用Replace方法,可以用另一个指定的字符来替换StringBuilder对象内的字符。该方法有两种重载方式,其语法格式如下:

public StringBuilder Replace(char oldChar, char newChar);

public StringBuilder Replace(string oldValue, string newValue);

其中,参数oldChar和oldValue为待替换的字符和子串,而参数newChar和newValue为替换后的新字符和新子串。

正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符和特殊字符。正则表达式通过使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。

正则表达式简介

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如HTML处理、日志文件分析和HTTP标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。

正则表达式的组成

构造正则表达式的方法和创建数学表达式的方法一样,也就是用多种元字符与运算符将小的表达式结合在一起,创建出更为复杂的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件 的任意组合。

正则表达式是由普通字符以及特殊字符组成的文本模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

1、普通字符

普通字符包括所有大写和小写字母,所有数字,所有标点符号和一些其他符号。

2、元字符

元字符 可以组合成灵活通用的表达式,来匹配所有符合此表达式规律和字符串。

常用元字符
代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下画线或汉字
\W匹配任意不是字母、数字、下画线、汉字的字符
\s匹配任意的空白符
\S匹配任意不是空白符的字符,等价于[^\f\n\r\t\v]
\d匹配数字
\D匹配任何非数字的字符,等价于[^0-9]
\b匹配单词的开始或结束
\B匹配不是单词开头或结束的位置
[CK]匹配包含括号内元素的字符
[^CK]匹配除了CK以外的任意字符
^匹配行的开始
$匹配行的结束
\对下一个字符转义,例如$是一个特殊的字符,要匹配$的话就要用\$
|分支条件,如x|y匹配x或y

特殊元字符
代码说明
\f匹配一个换页符,等价于\x0c和\xL
\n匹配一个换行符,等价于\x0a和\cJ
\r匹配一个回车符,等价于\x0d和\cM
\t匹配一个制表符,等价于\x00和\cI
\v匹配一个垂直制表符,等价于\x0b和\cK

限定符
代码说明
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
{n}n是一个非负整数。匹配确定的n次
{n,}n是一个非负整数。至少匹配n次
{n,m}m和n均为非负整数,其中,n≤m。最少匹配n次且最多匹配m次

正则表达式的优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。列出了从最高到最低各种正则表达式运算符的优先级顺序。

正则表达式的优先级
运算符描述
\转义符
(),(?:),(?=),[]圆括号和方括号
*,+,?,{n},{n,},{n,m}限定符

^,$,\

任何元字符、任何字符

定位点和序列(即:位置和顺序)
|替换

正则表达式匹配规则

正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出符合某个条件的子串等。

字符匹配

句点“.”匹配字符串中的各种打印或非打印字符,但是只有换行符“\n”例外。

若要匹配包含文件名的字符串,而句点“.”是输入字符串的组成部分,需要在正则表达式中的句点前面加反斜杠“\”字符。

中括号表达式

若要创建匹配字符组的一个列表,需要在中括号“[”与“]”内放置一个或更多单个字符。当字符括在中括号内时,该列表称为“中括号表达式”。

使用中括号表达式需要注意以下几点。

(1)\字符继续作为转义符。若要匹配\字符,需要使用\\。

(2)括在中括号表达式中的字符,只匹配处于正则表达式中该位置的单个字符。

(3)若要使用范围代替字符本身来表示 匹配字符组,需要使用连字符“-”将范围中的开始字符和结合字符分开。单个字符的字符值 确定范围内的相对顺序。

若要在中括号表达式中包括连字符,请采用下列方法之一。

(1)用反斜杠将它转义。

(2)将连字符放在中括号列表的开始或结尾。

(3)创建一个范围,在该范围中,开始字符值小于连字符,而结束字符值等于或大于连字符。

(4)若要查找不在列表或范围内的所有字符,需要插入符号“^”放在列表的开头。如果插入字符出现在列表中的其他任何位置,则它匹配其本身。

(5)中括号表达式的典型用途是指定任何大写或小写字母或任何数字的匹配。

重复匹配

在更多的情况下,可能要重复匹配一个单词或一组数字。一个单词由若干个字母组成,一个数字由若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容重复出现的次数。

重复匹配表达式
字符簇描述
^[a-zA-Z_]$所有的字母和下画线
^[[:alpha:]]{3}$所有的3个字母的单词
^a$字母a
^a{4}$aaaa
^a{2,4}$aa,aaa或aaaa
^a{1,3}$a,aa或aaa
^a{2,}$包含多于两个a的字符串
^a{2,}如aardvark和aaab,但aaple不行
a{2,}如baad和aaa,但是Nantucket不行
\t{2}两个制表符
.{2}所有的两个字符

一个数字{x}的意思是前面的字符或字符簇只出现x次;

一个数字加逗号{x,}的意思是前面的内容出现x或更多的次数;

两个用逗号分隔的数字{x,y}表示前面的内容至少出现x次,但不超过y次。

替换和分组

替换使用“|”字符来允许在两个或多个替换选项之间进行选择。

若要使替换的正则表达式更易于控制,可以使用括号来限制 替换的范围。

正则表达式涉及的基本类

目前为止,许多编程语言和工具都包含对正则表达式的支持,C#也不例外。C#基础类库中包含一个命名空间“System.Text.RegularExpressions”和一系列可以充分发挥正则表达式威力的类(如Regex、Match等)。

1、Regex类

Regex类表示只读正则表达式,它包含各种静态方法,允许在不显示创建其它类的实例的情况下,使用其它正则表达式类。

1、Regex类的常用方法

在C#中使用正则表达式主要是通过Regex类来实现。

Regex类的常用方法及使用
名称说明
IsMatch指示Regex构造函数中指定的正则表达式在指定的输入字符串中是否找到了匹配项
Match在指定的输入字符串中搜索Regex构造函数中指定的正则表达式的第一个匹配项
Matches在指定的输入字符串中搜索正则表达式的所有匹配项
Replace在指定的输入字符串内,使用指定的替换字符串替换与某个正则表达式模式匹配的所有字符串
Split在由Regex构造函数指定的正则表达式模式所定义的位置,拆分指定的输入字符串

2、定义Regex类的实例

以下代码实例创建了Regex类的实例并在初始化对象时定义一个简单的正则表达式:

Regex regex=new Regex(@"\d");

请注意,“\d”表示匹配一个0~9的数字。

3、Regex类的使用

判断一个字符串是否匹配一个正则表达式,在Regex对象中,可以使用IsMatch方法。

编写程序,使用正则表达式,匹配一个字符串。

using System;
using System.Text.RegularExpressions;
namespace Project19
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "2md13nabcttac";  //定义一个字符串str,并赋值
                                           //实例化Regex类的对象,再定义一个简单的正则表达式“abc”
            Regex regex = new Regex("abc");
            if (regex.IsMatch(str))  //通过IsMatch方法,判断字符串str是否匹配正则表达式
            {
                Console.WriteLine("字符串中包含abc");
            }
        }
    }
}

2、Match类

Match类表达单个正则表达式匹配的结果,该类没有公共构造函数。

1、Match类常用的方法及属性

Match类的常用属性
属性说明
Captures按从里到外、从左到事的顺序获取由捕获组匹配的所有捕获的集合(如果正则表达式用RightToLeft选项修改了,则顺序为按从里到外、从右到左)。该集合可以有零个或更多的项
Empty获取空组。所有失败的匹配都返回此空匹配。
Groups获取由正则表达式匹配的组的集合。
Index原始字符串中发现捕获的子字符串的第一个字符的位置
Length获取捕获的子字符串的长度
Name返回由当前实例表示的捕获组的名称
Success获取一个值,该值指示匹配是否成功
Value获取输入的字符串中捕获的子字符串

Match类的常用方法
方法说明
Equals(Object)确定指定的对象是否等于当前对象
GetType()获取当前实例的Type
NextMatch()从上一个匹配结束的位置(即在上一个匹配字符之后的字符)开始返回一个包含下一个匹配结果的新Match对象
Result(String)返回对指定替换模式的扩展
ToString()通过调用Value属性,从输入的字符串中检索捕获的子字符串

2、定义Match类的实例

可以从Regex类的Match方法得到该类的一个实例,也可以使用Regex类的Matches方法得到该类的一个集合,通过Match类的Success属性用于判断 匹配是否成功,Index属性返回第一个匹配的位置。

3、Match类的使用

编写程序,定义一个字符串,然后调用Match(String,String)和NextMatch方法来一闪检索一个匹配项。

using System;
using System.Text.RegularExpressions;
namespace Project20
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "int[] values = { 1, 2, 3 };\n" +
                      "for (int ctr = values.GetLowerBound(1); ctr <= values.GetUpperBound(1); ctr++)\n" +
                      "{\n" +
                      "   Console.Write(values[ctr]);\n" +
                      "   if (ctr < values.GetUpperBound(1))\n" +
                      "      Console.Write(\", \");\n" +
                      "}\n" +
                      "Console.WriteLine();\n";
            string pattern = @"Console\.Write(Line)?";
            //实例化Match类的对象为match,并返回的Regex.Match的方法中
            Match match = Regex.Match(str, pattern);
            //如果匹配成功,循环进行输出
            while (match.Success)
            {
                Console.WriteLine("\"" + "{0}" + "\"" + "在位置的源代码中找到 {1}.",
                                  match.Value, match.Index);
                match = match.NextMatch();
            }
        }
    }
}

运行结果:

"Console.Write"在位置的源代码中找到 112.
"Console.Write"在位置的源代码中找到 184.
"Console.WriteLine"在位置的源代码中找到 207.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值