第十七部分字符串字符和正则表达式教学课件_第1页
第十七部分字符串字符和正则表达式教学课件_第2页
第十七部分字符串字符和正则表达式教学课件_第3页
第十七部分字符串字符和正则表达式教学课件_第4页
第十七部分字符串字符和正则表达式教学课件_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十七章 字符串、字符和正则表达式本章的学习内容包括三个方面:1 创建和操纵 string 类的不可变字符串对象。2 创建和操纵 stringbuilder 类的可变字符串对象。3 结合 regex 类和 match 类来使用正则表达式。前面我们已经多次接触到 string 类的使用,本章将通过实例详细介绍定义在 system 命名空间中的 string 类型和 char 结构类型的创建和操纵方法。可变字符串类 stringbuilder 是定义在命名空间 system:text 中的,本章也将通过实例详细介绍使用 stringbuilder 创建和操纵的字符串与 string 类字符串的相同

2、之处和存在的差异。正则表达式是具有特殊格式的字符串,用来创建特定的字符串格式以便构造符合格式的字符串或识别已有字符串是否指定的格式。创建和操纵正则表达式的 regex 和 match 类型是定义在 system:text:regularexpression 命名空间中的,本章还将通过实例介绍正则表达式的使用。17.1 string 的创建字符串是程序的重要组成元素,c+/cli 程序中的字符串是根据 “unicode 字符集” 来建立的。unicode 是一种国际字符集包含了比 ascii 字符集多得多的符号和字母。字符串是被视为一个整体的一系列字符。在 c+/cli 中,字符串是 strin

3、g 类的一个对象。是托管引用类型,所以托管类程序中通常使用 string 指针来操纵 string 类对象。在 c+/cli 中,string 类直接量的表示方式有两种。例如:string color = “bulue”;/ 标准 c+ 字符串类型直接量string color = l“bulue”;/ 托管字符串类型直接量注意,在旧版本的 mc+ 中,托管字符串类型常量表示为: string color = s“bulue”,而 l“bulue” 表示标准 c+ 宽字符串类型常量。本节的实例是一个命名为 stringconstructor 的托管控制台应用程序,描述了 string 类对象的

4、创建和显示。string 类的构造函数有 8 个不同版本:string( char );用字符数组中的 unicode 字符初始化创建的 string 类对象。string( array );同上。string( sbyte );用有符号字节数组中的内容初始化创建的 string 类对象。string( char, int32 );用指定个数的 unicode 字符初始化创建的 string 类对象。string( char, int32, int32 );用字符数组中指定位置开始的指定个数 unicode 字符初始化创建的 string 类对象。string( array, int32, i

5、nt32 );同上。string( sbyte, int32, int32 );用有符号字节数组中指定位置开始的指定个数字节初始化创建的 string 类对象。string( sbyte, int32, int32, encoding );用有符号字节数组中指定位置开始的指定个数字节和一个 encoding (编码)类对象初始化创建的string 类对象。注意,本章实例 stringconstructor 中用托管数组 characterarray 定义、创建和初始化一个字符串的代码:array characterarray = gcnew array b,i,r,t,h,d,a,y ;另外,

6、由于程序需要使用了信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;实例 stringconstructor 的运行结果:17.2string 的索引属性、length 属性和 copyto 方法string 的索引属性用于只读访问其内含的字符数组中指定位置的字符。例如,本例 stringmethods 中的使用方法如下:string string1, output;for( int i = string1-length 1; i = 0; i- )output = str

7、ing:concat( output, string1i.tostring() );其中 string1i 等价于 string1-default:get( i )。length 属性用于只读访问其内含的字符数组的长度。例如,上述代码中的 string1-length,等价于 string1-length:get()。copyto 方法用于将指定对象中从指定位置开始的指定个数字符复制到一个指定托管字符数组中。该方法的原型如下:void copyto ( int sourceindex, array destination, int destinationindex, int count )例如

8、,本例中调用该方法的代码如下:string string1, output;array characterarray = gcnew array( 5 );string1-copyto( 0, characterarray, 0, 5);其操作含义是将 string1 中从 0 位置开始的 5 个字符复制到字符数组 characterarray 中从 0 位置开始的连续空间中。本节实例 stringmethods 也是一个托管类控制台程序,由于程序需要使用了信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace syst

9、em:windows:forms;该程序的运行结果如下:17.3 比较字符串1 使用 equals, compareto 方法和 = 运算符这些方法的原型:bool equals( string, string );bool equals( object, object );静态方法。用于比较两个指定字符串是否相等。bool equals( string );bool equals( object );动态方法。用于比较该字符串对象是否与指定字符串相等。int compareto ( object );动态方法。用于该对象与指定对象比较,并返回相关指示值。= 是运算符方法,用于比较两个指定字符

10、串。本章的实例 stringcompare 是一个托管类控制台程序,由于程序需要使用了信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;实例的运行结果如下:2 使用 startswith 和 endswith 方法这两个方法的原型:bool startswith( string );动态方法。用于比较调用该方法的字符串对象的开头部分是否与参数指定字符串相同。bool endswith( string );动态方法。用于比较调用该方法的字符串对象的结尾部分是否与参数指定字符串

11、相同。本节的实例 stringstartend 也是一个托管类控制台程序,由于程序需要使用了信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;该实例的运行结果如下:17.4 在字符串中定位字符和子字符串许多应用程序需要在字符串搜索一个或者一系列字符。例如,字处理软件一般要提供搜索整篇文档的功能。本例是一个名为 stringindexmethods 的托管类控制台程序,该程序中演示了string 类的 indexof、indexofany、lastindexof 和 last

12、indexofany 等方法的调用方法和功能。这些方法的原型如下:int indexof( char );用于在调用方法的 string 对象中,搜索指定字符,返回第一次匹配字符的位置值。int indexof( string );用于在调用方法的 string 对象中,搜索指定子串,返回第一次匹配子串的位置值。int indexof( char, int32 );用于在调用方法的 string 对象中,从指定位置开始,搜索指定字符,返回第一次匹配字符的位置值。int indexof( string, int32 );用于在调用方法的 string 对象中,从指定位置开始,搜索指定子串,返回第

13、一次匹配子串的位置值。int indexof( string, stringcomparison );用于在调用方法的 string 对象中,按指定搜索类型,搜索指定子串,返回第一次匹配子串的位置值。int indexof( char, int32, int32 );用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,搜索指定字符,返回第一次匹配字符的位置值。int indexof( string, int32, int32 );用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,搜索指定子串,返回第一次匹配子串的位置值。int indexof( s

14、tring, int32, stringcomparison );用于在调用方法的 string 对象中,从指定位置开始,按指定搜索类型,搜索指定子串,返回第一次匹配子串的位置值。int indexof( string, int32, int32, stringcomparison );用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,按指定搜索类型,搜索指定子串,返回第一次匹配子串的位置值。int indexofany( array );用于在调用方法的 string 对象中,搜索与指定字符数组中任意字符匹配的字符,返回第一次匹配字符的位置值。int indexofa

15、ny( array, int32 );用于在调用方法的 string 对象中,从指定位置开始,搜索与指定字符数组中任意字符匹配的字符,返回第一次匹配字符的位置值。int indexofany( array, int32, int32 );用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,搜索与指定字符数组中任意字符匹配的字符,返回第一次匹配字符的位置值。int lastindexof( char );用于在调用方法的 string 对象中,搜索指定字符,返回最后一次匹配字符的位置值。int lastindexof( string );用于在调用方法的 string 对象

16、中,搜索指定的子串,返回最后一次匹配子串的位置值。int lastindexof( char, int32 );用于在调用方法的 string 对象中,从指定位置开始,搜索指定字符,返回最后一次匹配字符的位置值。int lastindexof( string, int32 );用于在调用方法的 string 对象中,从指定位置开始,搜索指定子串,返回最后一次匹配子串的位置值。int lastindexof( string, stringcomparison );用于在调用方法的 string 对象中,按指定搜索类型,搜索指定子串,返回最后一次匹配子串的位置值。int lastindexof(

17、char, int32, int32 );用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,搜索指定字符,返回最后一次匹配字符的位置值。int lastindexof( string, int32, int32 );用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,搜索指定子串,返回最后一次匹配子串的位置值。int lastindexofany( array );用于在调用方法的 string 对象中,搜索与指定字符数组中任意字符匹配的字符,返回最后一次匹配字符的位置值。int lastindexofany( array, int32 );用于在

18、调用方法的 string 对象中,从指定位置开始,搜索与指定字符数组中任意字符匹配的字符,返回最后一次匹配字符的位置值。int lastindexofany( array, int32, int32 ); 用于在调用方法的 string 对象中,从指定开始位置到指定结束位置之间,搜索与指定字符数组中任意字符匹配的字符,返回最后一次匹配字符的位置值。本节实例 stringindexmethods 也是一个托管类控制台程序,由于程序需要使用了信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows

19、:forms;实例的运行结果如下:17.5 从字符串提取子字符串string 类提供了两个不同版本的提取子字符串方法 substring,该方法的两个版本原型如下:string substring( int32 );用于在调用方法的 string 对象中,获取从指定位置开始的剩余子字符串,并返回该子字符串拷贝的引用指针。string substring( int32, int32 ); 用于在调用方法的 string 对象中,获取从指定位置开始的指定长度的子字符串,并返回该子字符串拷贝的引用指针。实例 substring 也是一个托管类控制台程序,由于程序需要使用了信息框类 messagebo

20、x,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;实例的运行结果如下:17.6string 的其他方法string 类还提供了几个方法,replace、tolower、toupper、trim 和 tostring 用于返回原始字符串的一个修改过的拷贝。这些方法的原型如下:string replace( char, char );用于将调用方法的 string 对象中所有由第一个参数指定的字符替换为第二个参数指定的字符,并返回修改的 string 对象拷贝的引用指针。string replace( s

21、tring, string );用于将调用方法的 string 对象中所有由第一个参数指定的子串替换为第二个参数指定的字串,并返回修改后的 string 对象拷贝的引用指针。string tolower();依据当前的语言(例如,英文、法文等)缺省规则,将调用方法的 string 对象中所有字符转换小写,并返回修改后的string 对象拷贝引用指针。string tolower( cultureinfo );依据参数指定的语言(例如,英文、法文等)规则,将调用方法的 string 对象中所有字符转换小写,并返回修改后的 string 对象拷贝的引用指针。string toupper();依据当

22、前的语言(例如,英文、法文等)缺省规则,将调用方法的 string 对象中所有字符转换大写,并返回修改后的 string 对象拷贝的引用指针。string toupper( cultureinfo );依据参数指定的语言(例如,中文、英文等)规则,将调用方法的 string 对象中所有字符转换大写,并返回修改后的 string 对象拷贝的引用指针。string trim();用于删除调用方法的 string 对象中字符串头部和尾部的空格字符,并返回修改后的 string 对象拷贝的引用指针。string trim( array );用于删除调用方法的 string 对象中字符串头部和尾部的所有

23、由字符数组中指定的字符,返回修改后的 string 对象拷贝的引用指针。string tostring();返回实际上未修改的 string 对象拷贝的引用指针。string tostring( iformatprovider );依据指定的格式变换调用方法的 string 对象中字符串格式并返回修改后的 string 对象拷贝的引用指针。本节实例 stringmiscellaneous2 演示了如何使用这些方法,该实例也是托管类控制台程序,由于程序需要使用了信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace sys

24、tem:windows:forms;实例的运行结果如下:17.7stringbuilder 类string 类提供了许多字符串处理功能,但字符串内容永远不会改变。换句话说,string 类只能创建和操纵 “不可变字符串”。例如,使用 string 类的 concat 方法进行字符串连接,实际上是创建了一个新字符串,而被连接的字符串的内容并未发生变化。定义在 system:text 命名空间中的 stringbuilder 类用于创建和操纵动态的字符串信息,即 “可变字符串” (mutable string)。每个 stringbuilder 类对象都能存储特定数量的字符,具体由它的 “容量”(

25、capacity)属性来指定。扩展一个 stringbuilder 类对象的容量,就可以在对象中存储更多的字符。例如,可以 stringbuilder 类的 append 和 appendformat 方法进行与 string 类的 concat 方法相似的连接操作,但无须重新创建一个字符串。stringbuilder 类提供了 6 个重载的构造函数:stringbuilder();创建一个具有缺省容量的空字符串对象。stringbuilder( int32 );创建一个具有指定容量的空字符串对象。stringbuilder( string );依据指定字符串,创建一个字符串。stringbu

26、ilder( int32, int32 );创建一个指定容量,并可扩容到指定最大容量的空字符串。stringbuilder( string, int32 );依据指定字符串和指定的建议容量,创建一个字符串。stringbuilder( string, int32, int32, int32 );依据指定的子串(第二个参数指定子串开始位置,第三个参数指定子串长度)和指定的建议容量(第四个参数),创建一个字符串。本节实例 stringbuilderconstructor 也是一个托管类控制台程序,该实例中使用了 stringbuilder 类的三个版本的构造函数创建字符串对象。由于程序中使用了 s

27、tringbuilder 类和信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;using namespace system:text;实例的运行结果如下:17.8stringbuilder 类的属性 length、capacity 和方法 ensurecapacitystringbuilder 类的 length 和 capacity 属性分别获取 stringbuilder 类对象当前的字符数,以及在不分配更多内存的前提下,该 stringbuilder 类对象最多能够

28、存储的字符数。利用这些属性还能增大或缩小 stringbuilder 类对象的长度和容量。ensurecapacity 方法可以确保一个 stringbuilder 类对象具有足够的容量(使它大于或等于一个指定的值),从而有效地减少了以后必须扩容的次数。该方法的原型如下:int ensurecapacity( int );如果指定值大于字符串的当前容量,则增大字符串容量大于或等于指定值;否则不增容。本节实例 stringbuilderfeatures 也是一个托管类控制台程序,在实例中演示了对 stringbuilder 类的 length 和 capacity 属性以及 ensurecapa

29、city 方法的使用。由于程序中使用了 stringbuilder 类和信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;using namespace system:text;该实例的运行结果如下:17.9stringbuilder 类的 append 和 appendformat 方法1stringbuilder 类提供了 19 个重载版本的 append 方法,允许将各种数据类型值添加到一个 stringbuilder 类对象的末尾。c+/cli 针对每种基元数据类型

30、、字符数组、string 指针和 object 指针 都提供了独立的 append 方法版本。每种版本都将参数传递的值转换成 string 对象,再把它追加到 stringbuilder 类对象的末尾。这两个方法的多个版本的原型如下:stringbuilder append( boolean );由参数指定的布尔数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( byte );由参数指定的 8 位无符号整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder

31、 类对象)尾部。stringbuilder append( char );由参数指定的 unicode 字符值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( char );由参数指定的 unicode 字符数组中的字符值的字串表达(string 类对象)被追加到调用方法的字实例(stringbuilder 类对象)尾部。stringbuilder append( decimal );由参数指定的十进制整数数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder

32、 类对象)尾部。stringbuilder append( double );由参数指定的双精度浮点数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( int16 );由参数指定的 16 位整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( int32 );由参数指定的 32 位整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stri

33、ngbuilder append( int64 );由参数指定的 64 位整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( object );由参数指定的 obeject 或派生的托管引用类对象的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( sbyte );由参数指定的 8 位有符号整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。s

34、tringbuilder append( single );由参数指定的单精度浮点数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( string );由参数指定的 string 类型对象被追加到调用方法的字串实例(stringbuilder 类对象)的尾部。stringbuilder append( uint16 );由参数指定的 16 位无符号整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append

35、( uint32 );由参数指定的 32 位无符号整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( uint64 );由参数指定的 64 位无符号整数值的字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。stringbuilder append( char, int32 );由第一参数指定的 unicode 字符值的字串表达(string 类对象)的指定个数(第二参数指定)拷贝被追加到调用方法的字符串实例(stringbuilder 类对象

36、)尾部。stringbuilder append( char, int32, int32 );由第一参数指定的 unicode 字符数组中指定子字串的字符值的字串表达(string 类对象)被追加到调用方法的字符串实例(stringbuilder 类对象)尾部。第二参数指定了子字串的开始位置,第三参数指定了子字串中的字符个数。stringbuilder append( string, int32, int32 );由参数指定的 string 类型对象的子字串被追加到调用方法的字串实例(stringbuilder类对象)的尾部。第二参数指定了子字串的开始位置,第三参数指定了子字串中的字符个数。本

37、节的第一个实例 stringbuilderappend 也是一个托管类控制台程序,在该实例中演示了对 stringbuilder 类的 append 方法的使用。由于程序中使用了 stringbuilder 类和信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;using namespace system:text;实例的运行结果如下:2stringbuilder 类提供了多个重载版本的 appendformat 方法,允许将一个或多个托管类对象转换成指定的格式的 stri

38、ng 类对象,然后再把它追加到 stringbuilder 类对象的尾部。下面给出该方法最常用的两个版本的原型:stringbuilder appendformat( string, object, );由第二参数开始指定的 obeject 或派生的托管引用类对象的指定的格式字串表达(string 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)的尾部。第一参数指定了追加字串的格式。stringbuilder appendformat( string, array );由最后一个参数指定的 obeject 或派生的托管引用类数组中每个对象的指定的格式字串表达(strin

39、g 类对象)被追加到调用方法的字串实例(stringbuilder 类对象)尾部。前面的参数指定了托管引用类数组中每个对象的字串的格式。本节的第二个实例 stringbuilderappendformat 也是一个托管类控制台程序,该实例演示了对 stringbuilder 类的 appendformat 方法的使用。由于程序中使用了 stringbuilder 类和信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;using namespace system:text;实

40、例的运行结果如下:17.10 stringbuilder 类的 insert,remove 和 replace 方法1stringbuilder 类提供了 18 个重载版本的 insert 方法,允许将各种数据类型值对象或引用类型对象的字符串表达( string 类型对象)插入到一个 stringbuilder 类对象的任何指定位置。为此, stringbuilder 类为每种基元数据类型、字符数组、string 指针和 object 指针都提供了相应的 insert 方法版本。每种版本的第一个参数总是用于指定插入的位置,其他参数用于传递需要插入的类型对象。下面给出四个有代表性的版本原型:st

41、ringbuilder insert( int32, double );第二参数指定的双精度浮点数值的字串表达(string 类对象)被插入到调用方法的字符串实例(stringbuilder 类对象)的指定位置(由第一参数指定)。stringbuilder insert( int32, object );第二参数指定的 obeject 或派生的托管引用类对象的字串表达(string 类对象)被插入到调用方法的字串实例(stringbuilder 类对象)的指定位置(由第一参数指定) 。stringbuilder insert( int32, string, int32 );第二参数指定的 st

42、ring 类型对象的 n 个拷贝被插入到调用方法的字串实例(stringbuilder 类对象)的指定位置(由第一参数指定)。第三参数指定了 string 类型对象的拷贝个数 n。stringbuilder insert( int32, char, int32, int32 );第二参数指定的 unicode 字符数组中指定子字串字符值的字串表达(string 类对象)被插入到调用方法的字串实例(stringbuilder 类对象)指定位置。第三参数指定了子字串的开始位置,第四参数指定了子字串中的字符个数。stringbuilder 类还提供了 remove 方法,使用该方法能删除字符串的任何

43、部分。该方法的原型如下:stringbuilder remove( int, int );删除字串实例中从指定位置(第一参数指定)开始,指定个数(第二参数指定)字符,并返回修改后的字符串。本节的第一个实例 stringbuilderinsertremove 也是一个托管类控制台程序,该实例演示了对 stringbuilder 类的 insert 和 remove 方法的使用。由于程序中使用了 stringbuilder 类和信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;

44、using namespace system:text;实例的运行结果如下:2stringbuilder 类提供的 replace 方法也非常有用。使用该方法能够搜索指定的字符串或字符,然后用另一个指定的字符串或字符来替换。该方法有 4 个版本,这些版本的原型:stringbuilder replace( char, char );在字串实例中,用第二参数指定的字符替换所有由第一参数指定的字符,并返回修改后的字串实例。stringbuilder replace( string, string );在字串实例中,用第二参数指定的字串替换所有由第一参数指定的字串,并返回修改后的字串实例。strin

45、gbuilder replace( char, char, int32, int32 );在字串实例中,从指定的位置(第三参数给出)开始的确定长度(第四个参数给出)的子字串中,用第二个参数指定的字符替换所有由第一个参数指定的字符,并返回修改后的字串实例。stringbuilder replace( string, string, int32, int32 );在字串实例中,从指定的位置(第三参数给出)开始的确定长度(第四个参数给出)的子字串中,用第二个参数指定的字串替换所有由第一个参数指定的字串,并返回修改后的字串实例。本节的第二个实例 stringbuilderreplace 也是一个托管类

46、控制台程序,该实例演示了对 stringbuilder 类的 replace 方法的使用。由于程序中使用了 stringbuilder 类和信息框类 messagebox,所以需要添加使用该类所属命名空间和相应动态库的语句:#using using namespace system:windows:forms;using namespace system:text;实例的运行结果如下:17.11 char 类型的方法char 类型和其他基元数据类型一样,是 c+/cli 提供的一种结构数据类型。它提供的方法大多数是静态方法,这些方法至少要获取一个字符参数,并对该字符执行一次测试或操作。对这些方

47、法的调用形式与对其他类型的方法调用形式相同。本节的实例 staticcharmethods 是一个托管类窗口程序,实例的功能是:对用户从键盘输入的字符进行分析,并将分析结果信息显示输出。为此,程序中使用了 char 类型判断字符是否属于特定字符类型的静态方法(isdigit、isletter 等),以及对字符执行大小写转换的静态方法(toupper、tolower 等)。该实例的 gui 设计如下:实例的运行结果如下:17.12 洗牌和发牌模拟实例本节的实例是使用随机数生成技术设计、编写的一个模拟洗牌和发牌的托管类窗口应用程序。该程序的设计思路和方法可在模拟玩牌的其他应用程序中直接使用。在程序

48、设计中,card 类是用来描述 “牌” 这个重要对象的 。该类包含两个 string 数据成员,即用于存储 “牌” 的牌面名称的 face 和用于存储 “牌” 的花色名称的 suit。用于创建每张 “牌” 对象的构造函数需要接收两个 string 参数,来初始化 face 和 suit 。 card 类还包含一个 tostring 方法,用于创建由 face 和 suit 连接构成的 string 对象,并返回该对象类型的引用指针 string。在应用程序的主窗体类 form1 中添加一个包含 52 个 card 的数组,用于存放一副牌。为了交互实现洗牌和发牌操作,需要在主窗体中添加两个按钮(

49、button)控件,分别用于产生洗牌和发牌的事件。另外,还需要添加两个标签(label)控件,用于发牌操作时,显示当前牌在一副牌中的顺序,以及该牌的花色和牌面信息。主窗体的 gui 设计如下:在程序的编写需要注意以下几点:1card 类的 tostring 方法应该是重载基类 system:object 的虚方法 tostring, 所以必须在方法的声明或定义首行加入 virtual 前缀和 override 或 new 后缀。virtual string tostring() override;2 存储一副牌的数组应该是一个静态托管类数组,其定义代码如下:private: static ar

50、ray deck = gcnew array(52);3 数组 deck 的初始化应该在主窗体创建的同时进行。为此,需要添加主窗体类 form1 的 load 事件的处理方法。该方法的定义代码如下:system:void form1_load( system:object sender, system:eventargs e)array faces = gcnew array lace, ldeuce, lthree, lfour, lfive, lsix, lseven, leight, lnine, lten, ljack, lqueen, lking ;array suits = gcn

51、ew array lhearts, ldiamonds, lclubs, lspades ;/ no cars have been drawncurrentcard = -1;/ initialize deckfor(int i = 0; i length; i+)decki = gcnew card( facesi % 13, suitsi % 4);/ end method form1_load4 洗牌操作的实现思想依次随机交换 deck 数组的两个元素。在完成洗牌操作的 form1 辅助方法 shuffle 中,调用了 random 类的 next 方法生成 0 51 的随机数,并用所生

52、成的随机数作为每次数组元素交换操作的一个下标值。这样的交换操作依次循环进行 52 次,便完成一次洗牌。该辅助方法在洗牌按钮的 click 事件处理方法中被调用。 shuffle 的定义代码如下:void shuffle()random randomnumber = gcnew random();card temporaryvalue;currentcard = -1;/ swap each card with random cardfor(int i = 0; i length; i+)int j = randomnumber-next( 52 );/ swap cardstemporaryv

53、alue = decki;decki = deckj;deckj = temporaryvalue;/ end fordealbutton-enabled = true;/ end method shuffle该应用程序的运行结果如下:17.13 正则表达式和 regex 类正则表达式是具有特殊格式的字符串,用于查找文本中的特定的文本 “模式”(patterns),即查找文本中与指定正则表达式 “匹配”(match)的子文本。正则表达式特别适合用来验证信息的有效性,确保数据具有特定的格式。例如,美国的邮政编码必须是 5 位数字,姓氏必须以大写字母开头等等。.net framework 提供了几

54、个类来帮助开发者识别和操纵正则表达式。其中,regex 类(定义在 system:text:regularexpressions 命名空间)表示一个不可变的正则表达式。利用它包含的静态方法,可以直接使用 regex 类功能,而无须创建类对象。另外,match 类用于表示一次正则表达式匹配操作的结果。 regex 类提供了 match 方法,它返回 match 类的一个对象,该对象表示单独一次正则表达式匹配的结果(匹配项)。 regex 类还提供了 matches 方法,它能在任意字符串中查找一个正则表达式的所有匹配项,并返回 matchcollection 类对象(多个 match 对象组成的

55、集合)。regex 类的构造函数有 4 个版本,其中常用的有以下两个:regex();创建一个 regex 类对象,不设定对象的正则表达式。regex( string );创建一个 regex 类对象,并用参数传递的字符串设定对象的正则表达式。 regex 类的 match 方法有 5 个版本,其中常用的有以下 4 个:match match( string );在参数指定的字符串中,查找与对象正则表达式的一个匹配,并返回该匹配类型对象的引用指针。match match( string, int32 );从第一参数指定的字符串的指定位置(第二参数给出)开始,查找与对象正则表达式的一个匹配,并返

56、回该匹配类型对象的引用指针。 match match( string, string );在第一参数指定的字符串中,查找与第二参数指定的正则表达式的一个匹配,并返回该匹配类型对象的引用指针。 match match( string, int32, int32 );从第一参数指定的字符串的指定位置(第二参数给出)开始的指定长度(第三参数给出)范围内,查找与对象正则表达式的一个匹配,并返回该匹配类型对象的引用指针。matches 方法有 4 个不同的版本,其中常用的有以下 3 个:matchcollection matches( string );在参数指定的字符串中,查找与对象正则表达式的所有匹

57、配,并返回该匹配集合类型对象的引用指针。matchcollection matches( string, int32 );从第一参数指定的字符串的指定位置(第二参数给出)开始,查找与对象正则表达式的所有匹配,并返回该匹配集合类型对象的引用指针。matchcollection matches( string, string );在第一参数指定的字符串中,查找与第二参数指定的正则表达式的所有匹配,并返回该匹配集合类型对象的引用指针。 正则表达式是查找匹配的关键。正则表达式是由 “直接字符” (literal text characters) 和 “元字符”(metacharacters)构成的。元

58、字符集决定了正则表达式的处理能力。本节只介绍元字符的一些用于匹配的常用字符类和限定符,详细内容请查阅 msdn 的 .net framework regular expressions 和 regular expression language elements 的相关内容。常用的正则表达式的 “字符类”:字符 匹配 字符 匹配d 任意数字字符 d 任意非数字字符w 任意单词字符 w 任意非单词字符s 任意空白字符 s 任意非空白字符所谓 “单词字符” 是指任何字母、数字或者下划线字符。“空白字符” 是指空格、制表符、回车符、换行符或者换页符。“数位” 是指任何数值字符。注意,正则表达式并不限

59、定于使用这些字符类。你可以在表达式中综合运用各种运算符和其他记号方式来检索复杂的 “模式”。注意,每个类都要附加 “”,例如,d。常用的正则表达式的 “限定符”:限定符 匹配. 匹配任意单个字符* 匹配它前面的模式的 0 次或多次出现+ 匹配它前面的模式的 1 次或多次出现? 匹配它前面的模式的 0 次或多次出现限定符 匹配n 匹配它前面的模式的 n 次出现n, 匹配它前面的模式的至少 n 次出现n, m 匹配它前面的模式的 nm 次出现(包括 m 次)如果一系列字符不属于某个限定字符类,可以用一对方括号来列出要匹配的字符。例如,aeiou 表示这一模式可以匹配任何元音字母。要表示一个字符范围

60、,可在首尾两个字符间插入一个短划线 “-”。例如,0-35-9 表示只匹配所指范围内的数字字符,即 03 或 59。也就是说,它匹配除4 之外的所有数字字符。如果方括号中的第一个字符是 “”,表达式含义是接受除了指定字符之外的任意字符。注意,4 并不等价于 0-35-9。另外短划线 “-” 在方括号外就被视为是一个直接匹配字符。本节的实例一 regexmatches 是一个托管类控制台程序。该程序中演示使用 regex 类的 matches 方法进行正则表达式匹配查找符合特定条件的人员生日信息的功能。其中,描述人员生日信息的字符串格式为:“xxx.x s birthday is mm-dd-y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论