字符串与正则表达式Word文件下载.docx
- 文档编号:17687274
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:26
- 大小:799.19KB
字符串与正则表达式Word文件下载.docx
《字符串与正则表达式Word文件下载.docx》由会员分享,可在线阅读,更多相关《字符串与正则表达式Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
1.组与非捕捉组21
2.贪婪与非贪婪22
3.回溯与非回溯23
4.高级组24
5.决策字符24
6.选项标志24
7.正则表达式引擎的规则25
第一部分字符串基础
1.C#数据类型
1.1.值类型和引用类型
.NET中两种基本的数据类型是值类型和引用类型。
值类型包括整型、枚举、结构和字符。
值类型直接存储在栈(stack)上,栈是操作系统分配的一个连续的内存区域,用于快速访问数据。
CLR对每一个正在运行的进程使用虚拟栈。
因为值类型的容量是已知的,所以它可以存储在栈上。
值类型可以直接访问,很少通过引用访问。
当复制值类型时,值就被复制到另一个存储位置。
引用类型包括类、接口、数组和字符串。
引用类型存储在托管堆中,托管堆是用于动态内存分配的内存区域,其中可以任意次序分配和释放内存块。
引用类型的容量直到运行时才能知道。
这就是使用堆存储引用类型的原因。
可以通过对托管堆得引用访问引用类型。
这允许垃圾收集器跟踪引用,当引用不存在时,就释放存储区。
当复制引用变量时,实际上是复制引用(内存地址),而不是值本身。
1.2.字符和字符集
按信息术语,字符是具有拼音文字或象形文字含义的书面符号,通常用于组成文本的单词、描述数值或表达语法符号。
在今天的信息技术中,字符通常指有限数目的符号,包括某种语言字母表中的字母,十进制数字系统中的数字和某些特殊符号,比如宏(&
)和“at”符号(@).
人们已经为字符开发了几种计算机编码标准。
个人计算机中最常用到的标准时ASCII。
IBM大型机系统使用EBDIC。
后来出现的Windows系统开始支持新的标准Unicode。
ASCII字符存储为7位二进制数字。
扩展的ExtendedASCII能够增加128个值。
Unicode的文本容量是ASCII的两倍达到了
,但是并不能完全满足要求(汉语就有5万多字符),为了解决这个问题,Unicode标准定义了代理。
代理或代理对是一对16为的Unicode代码值,表示单个的字符。
通过代理Unicode可以支持100多万字符,而且并没有因此而消耗更多的内存。
1.3.内置
有时,应用程序需要反复重用某些字符串。
利用这种特征可以大大节省内存空间,提高程序运行性能,为此我们需要使用内置(interning)这种数据结构和算法集。
当重复使用相同的字符串时,内置可以提高程序运行性能。
内置在前期会消耗一些资源成本,但是一旦就位,它可以支持字符串之间有效的相等新检查,因为它比较放在池中的对象,而不是字符序列。
CLR自动维护一个称为”内存池”(internpool)的表,此表包含程序中声明的每一个唯一的字符串常量的单个实例,以及以编程方式创建的System.String类的任何唯一实例。
内置池实现为散列表。
使用散列表以为着,一个字符串可以通过一个数字或”散列码”来表示。
这样比较和搜索字符串就非常有效,因为这不是逐个字符第比较字符串,而仅仅是比较散列值。
内置池节省字符串存储空间。
如果将一个字面字符串常量赋给几个变量,则每一个变量引用内置池中相同的常量,而不是引用具有相同值的System.String类的几个不同实例。
使用StringBuilder类创建的字符串可以使用Intern()方法手工添加到内置池中。
1.4.字符串操作
字符串操作一般可以分为以下五类:
●连接字符串
●从字符串中提取子字符串
●比较字符串
●转换字符串
●格式化字符串
连接字符串操作要消耗大量内存,因为每一次连接,都是先分配一个新的内存,然后把源字符串复制到新的字符串并释放旧的副本。
提取子字符串操作也需要分配新的内存。
转换字符串采用的步骤是首先基于数据类型选择算法,判断转换后的数据大小,为字符串分配内存,执行转换算法生成字符串。
转换需要的系统资源主要取决于所选择的转换算法。
字符串比较是常见的操作。
通常用户会输入一些文本,程序需要确定用户所输入的内容。
一些字符串比较操作要求进行精确匹配。
这是非常直接的操作,因为这是两个字符串之间逐个字符的简单比较。
在许多情况下字符串比较用于验证工作,字符串的内容没有那么重要,相反地它的格式非常重要。
执行这样的比较就需要用到正则表达式。
格式化用于根据一个值的内部机器来创建该值的最终用户视图。
格式化可以描述任何数据类型到字符串的转换。
格式化的优势在于程序员可以指定格式转换如何进行。
1.4.1.格式化数字
Doubleval=Math.PI
格式
结果
描述
val.ToString()
3.14159265358979
默认值
val.ToString(“E”)
3.141593E+000
科学计数
val.ToString(“F3”)
3.142
定点计数
val.ToString(“p”)
314.16%
百分比计数
val.ToString(“p3”)
314.159%
定点百分比
val.ToString(“C”)
¥3.14(中文)
货币格式
intval1=6522
val.ToString(“x”)
197a
小写的十六进制
val.ToString(“X”)
197A
大写的十六进制
格式具有很大的灵活性,我们可以通过如下的方式设置格式。
doubleval2=1234567.89;
int[]groupSzie={2,1,3};
objectmyObject=NumberFormatInfo.CurrentInfo.Clone();
NumberFormatInfomyCrrency=myObjectasNumberFormatInfo;
myCrrency.CurrencySymbol="
@"
;
myCrrency.CurrencyDecimalSeparator="
/"
myCrrency.CurrencyGroupSizes=groupSzie;
myCrrency.CurrencyGroupSeparator="
-"
strings6=val2.ToString("
C"
myCrrency);
//s6的值为@1-234-5-67/89
1.4.2.格式化日期
DateTimeDateValue=DateTime.Now;
DateValue.ToString()
2010-11-118:
24:
38
DateValue.ToString(“yyyy-MM-dd”)
2010-11-01
时间格式
DateValue.ToString(“T”)
18:
26:
17
长时间格式
DateValue.ToString(“t”)
26
短时间格式
DateValue.ToString(“D”)
2010年11月2日
DateValue.ToString(“d”)
2010-11-2
同样我们也可以定制我们自己的时间格式。
DateTimedateValue=DateTime.Now;
string[]myDays={"
1-Day"
"
2-Day"
3-Day"
4-Day"
5-Day"
6-Day"
7-Day"
};
objectmyObj=DateTimeFormatInfo.CurrentInfo.Clone();
DateTimeFormatInfomyDateTimeInfo=myObjasDateTimeFormatInfo;
myDateTimeInfo.FullDateTimePattern="
dddd,dd,MM,yyyyHH:
mm:
ss"
myDateTimeInfo.DayNames=myDays;
stringdateTest=DateValue.ToString("
F"
myDateTimeInfo);
//Console.WriteLine({0:
F},dateTest);
//dateTest值为2-Day,01,11,201018:
参数format格式详细用法
a)T:
长时间格式显示由与当前线程关联的
DateTimeFormatInfo.LongTimePattern属性定义的模式或者由指定格式提供程序定义的模式。
b)t:
短时间格式显示由与当前线程关联的
DateTimeFormatInfo.ShortTimePattern属性定义的模式或者由指定格式提供程序定义的模式。
c)D:
长日期模式显示由与当前线程关联的
DateTimeFormatInfo.LongDatePattern属性定义的模式或者由指定格式提供程序定义的模式。
d)d:
短日期模式显示由与当前线程关联的
DateTimeFormatInfo.ShortDatePattern属性定义的模式或者由指定格式提供程序定义的模式。
e)F:
完整日期时间格式(长日期长时间)显示由与当前线程关联的
DateTimeFormatInfo.FullDateTimePattern属性定义的模式或者由指定格式提供程序定义的模式。
f)f:
完整日期时间格式(长日期短时间空格分开)
g)G:
常规日期时间格式显示短日期长时间的组合,由空格分开。
h)g:
常规日期时间模式显示短日期和短时间的组合,由空格分开。
i)M/m:
月日模式显示由与当前线程关联的
DateTimeFormatInfo.MonthDayPattern属性定义的模式或者由指定格式提供程序定义的模式。
j)Y/y:
年月模式显示由与当前线程关联的
DateTimeFormatInfo.YearMonthPattern属性定义的模式或者由指定格式提供程序定义的模式。
k)R/r:
RFC1123模式显示由与当前线程关联的
DateTimeFormatInfo.RFC1123Pattern属性定义或者由指定格式提供程序定义的模式。
这个属性石只读的,因此无论所使用的区域性文化或所提供的格式程序是什么,它总是相同的。
属性引用CultureInfo.InvariantCulture属性并遵照自定义模式”ddd,ddMMMyyyyHH:
ssG\MT”.请注意GMT中的M需要转义符,因此它不被解释。
格式化不需要修改DateTime的值,所以必须在格式化之前将值调整为GMT时间。
l)s:
可排序的日期/时间模式;
符合ISO86001显示由与当前线程关联的DateTimeFormatInfo.SortableDateTimePattern属性定义的模式或者指定格式提供程序定义的模式。
属性引用
CultureInfo.InvariantCulture属性,格式遵守自定义模式
”yyyy-MM-ddTHH:
ss”.
m)u:
通用可排序日期/时间模式显示由与当前线程关联的
DateTimeFormatInfo.UniversalSortableDateTimePattern属性定义的模式或者由指定格式提供程序定义的模式。
它是一个只读属性,因此无论区域性或格式提供程序是什么,模式总是相同的.格式化遵照自定义模式”yyyy-MM-ddHH:
ssZ”,格式化日期和时间的时候不进行时区转换,在使用格式说明符之前应先将时间转换成通用时间。
n)U:
通用可排序日期时间模式显示由与当前线程关联的
DateTimeFormatInfo.FullDateTimePattern属性定义的模式或者由指定格式提供程序提供程序定义的模式。
1.4.3.格式化枚举
enumMusic
{
Rock=1,
Blues=2,
Jazz=3,
Classical=4
}
MusicmyMusic=Music.Blues;
myMusic.ToString()
Blues
默认显示
myMusic.ToString("
d"
)
2
显示对应数字值
1.4.4.字符串的使用
插入、删除和替换
stringBuildersb=newstringBuilder();
sb.Append(“增!
加”);
sb.Remove(0,sb.ToString().IndexOf(“!
”))//移除0到!
位置的信息。
stringMytest=”123456789”;
stringResult=Mytest.Insert(2,”@”);
//12@3456789
Mytest.Repalce(“3”,”C”);
//12C456789
2.国际化与文化
System.Text命名空间提供了一系列的编码类,可以用来在Unicode(UTF-16)和其他编码间对字符串进行转换。
为什么要进行转换?
因为从已有的代码页转换为Unicode,是在依赖系统上代码页的原应用程序和在.NETFramework上开发的应用程序之间进行数据转换的一种方式。
1.5.Encoding类
Encoding类是其他编码的基类。
它提供了方法,可以使Unicode字符数组和字符串与使用Windows代码页编码的字节数组之间进行相互转换。
简单地说,这种机制允许把Unicode字符转换为字节,因为不支持Unicode的Windows旧版本(如Windows98)开发的应用程序可以把这些字节识别为字符。
下面的代码示例演示了如何使用编码类在Unicode和代码页1252(为英文使用的代码页)及932(为日文使用的代码页)。
注意转换日文字符,如果指定的代码页是1252或是932,产生的结果是不同的。
如果指定了代码页1252,这些字符将无法识别,因为代码页1252不支持日文,而只处理用于编写西欧语言的Latin文字。
此时日文字符会转换为问号。
但是如果指定代码页932,将生成正确的日文字符。
EncodingmyEncode1=Encoding.GetEncoding(1252);
EncodingmyEncode2=Encoding.GetEncoding(932);
byte[]myBytes1=myEncode1.GetBytes("
\u307B\u308B\u305A"
);
byte[]myBytes2=myEncode2.GetBytes("
stringmessage1="
\u307B\u308B\u305A在1252代码页被转换成:
"
stringmessage2="
\u307B\u308B\u305A在932代码页被转换成:
stringResult_1=myEncode1.GetString(myBytes1);
//”?
?
”
stringResult_2=myEncode2.GetString(myBytes2);
//”ほるず”
很多Encoding的派生类也在System.Text命名空间中提供,包括:
●ASCIIEncoding类,用7位ASCII范围内的字符。
如果试图转换此范围外的一个Unicode字符,将得到一个异常,并且字符也不会被编码。
●UnicodeEncoding类,用两个连续字节为每个Unicode编码。
不同的操作系统在内部存储数据时使用不同的字节顺序,有的采用大数在前的顺序优先存储总要字节,有的采用小数在前的顺序最后存储总要字节。
例如字符F定义为UnicodeU+0046,在采用大数在前的顺序的机器中,编码为字节0046,在采用小数在前的顺序的机器中,编码为字节4600。
UnicodeEncoding类,提供了对这两种字节顺序的支持,从而使这个类在.NETFramework(小数在前的顺序)与一些大型机和Unix系统(大数在前的顺序)交换数据时特别有用。
●UTF7Encoding类,使用UTF-7为Unicode字符编码,支持所有的Unicode字符值,并把它们转换为7位的变长格式。
●UTF8Encoding类,使用UTF-8为Unicode字符编码,也支持所有的Unicode字符。
采用GetEncoding(“gb-18030”)的代码页可以支持中文。
如果处理的是大量的数据,或者数据来自流而且只能在连续的块中获得,就需要使用Decoder和Encoder类来执行转换。
这些类与方法GetBytes()和GetChars()不一样,它们可以保存支持跨越几个块的数据转换所需的状态信息。
1.6.CultureInfo类
CultureInfo类是System.Globalization命名空间中最重要的类。
它提供了特定文化的信息,如文化名称,它的相关语言,国家/区域,日历和文化惯例。
这个类还能够访问提供其他特定文化信息的类实例,如DateTimeFormatInfo、NumberFormatInfo、CompareInfo和TextInfo。
这些对象包含特定文化的操作(如大小写,格式化日期和数字,比较字符串)所需的信息。
所以,通过指定一个文化,就可以将一套通用的参数用于与用户的文化习俗相对应的字符串、日期和数字格式的信息。
1)文化名称
文化名称派生于RFC1766标准。
这个标准使用了格式language[-country/region],其中language是一个小写的2个字母(有时为3个字母)代码,由ISO-639-1标准派生而来,country/region是2个大写的字母代码,派生于ISO3166标准。
例如en表示英语,en-US表示美国英语,kok-IN表示印第安语。
一个文化名称可以包含也可以不包含country/region信息,而且名称可以用语言信息来指定。
例如日语作为一种语言指定为ja,作为口语指定为ja-JP.
此外,一些语言名称具有的后缀可以指定文字,例如-Cyrl代表古代斯拉夫文字,-Latn代表拉丁文字,sr-SP-Cyrl代表塞尔维亚(古代斯拉夫)文字,sr-SP-Latn代表塞尔维亚(拉丁)文字。
2)文化的不同类型
.NETFramework实现了200多种文化,这些文化可以划分为以下类型:
唯一的不变文化、中立文化。
具体的文化
它们的关系如下例
不变文化是位于.NETFramework所实现的文化树根部的一个唯一的文化。
它与英语有关,但是它与一个国家或地区无关,是真实世界并不存在的一种文化。
它一种不区分文化的文化。
这看上去很奇怪,但并不是没有逻辑,因为有许多的进程需要独立于文化的结果,如系统服务。
不变文化的典型应用是处理Web服务的日期和时间储存,以及要传递给操作系统的文件名的大写。
以一种文化独立的格式储存数据可保证已知格式不被修改。
当不同文化的用户需要访问使用不变文化格式存储的数据时,可以为改用户适当地格式化次数据,方法是把数据转换为适合这个用户的文化。
例如,在后端用不变文化格式储存的数据,在前端可以使用汉语进行分析和格式化,这样在前端可以得益于合适的文化,在后端有相同的储存。
中立文化与语言相关,但与一个国家或地区无关。
因此,中立语言非常使用于只与语言相关的操作,但不能用于检索信息,如日期和时间格式,因为各个国家和地区各不相同,即使在同一语言的范围内也有可能不同。
如美国和英国的日期和时间格式就不相同。
具体语言提供的信息与语言和国家或地区相关。
例如,de是一个中立的德语文化,de-DE则是代表了德语(德国)的具体文化。
中立文化与具体文化的主要区别在于后者提供了与具体地区或国家相关的日期、时间、货币和数字格式选项的附加信息。
3)CultureInfo的两个角色
一个国际化的应用程序需要处理国际化数据(属于应用程序数据的日期、时间、货币和字符等)此外,它还要本地化,以使国际用户能以最简单、最高效的方式使用该应用程序。
但是,对于一个国际化应用程序,本地化并不是必须的。
CurrentCulture和CurrentUICulture是CultureInfo两个重要角色。
CurrentUICulture的值决定了如何为一个窗口加载资源,用于对资源数据进行特定文化查找。
它确定了窗口元素以什么语言显示。
CurrentCulture值的唯一作用是指定资源管理器加载与窗口相关的资源应使用的语言。
我们可以用中立语言或者具体语言来指定它。
CurrentCulture的值决定了其他方面——日期格式、数字格式、字符串大小写和比较等。
它只能设为具体文化,如en-US。
两种文化设定不需要具有相同的值。
在应用程序的设计中,分别设定它们非常重要。
CurrentCulture和CurrentUICulture在应用程序的线程级设定,使多线程的引用程序在不同的线程使用不同的文化。
如果没有指定它们的值,它们将从操作系统继承,所以开发人员总能拥有有效的CurrentCulture和CurrentUICulture定义。
设置CurrentCulture和CurrentUICulture。
如果没有显示地设定CurrentCulture属性,那么系统将从Windows中的GetUserDefaultLCIDAPI取得一个默认值。
修改控制面板的区域和语言选项会影响到此值。
如果CurrentUICulture属性没有在应用程序的代码中显示地设置,它将在应用程序启动时,有Windows资源使用的默认语言来设置。
用户不能修改这个默认值。
除非使用Windows的多国语
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串 正则 表达式
![提示](https://static.bdocx.com/images/bang_tan.gif)