专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 正则表达式字符串:理解VC# 2005中的字符串和正规表达式 »正文

正则表达式字符串:理解VC# 2005中的字符串和正规表达式

来源: 发布时间:星期五, 2009年1月9日 浏览:31次 评论:0
  不管创建什么类型应用你都需要使用无论数据如何存储终端用户总要和可读文本打交道因此了解如何使用串是任何.NET开发者创建丰富应用所需要学习必要知识除了向你展示在.NET框架中使用外本文还将向你介绍正规表达式知识

  除了向你展示如何使用.NET框架中串外本文还将向你介绍正规表达式正规表达式是格式代码不仅允许你验证个特定串匹配个给定格式而且你还可以使用正规表达式来从任何其它可能被认为是自由格式文本中提取有意义信息例如从用户输入中提取第个名字或从个数字输入中提取代码或从个URL中提取服务器名

  、 使用

  使用串是创建高质量应用个必要窍门技巧即使你在处理数字或图像数据终端用户也需要上下文反馈本文将向你介绍.NET如何格式它们操作它们和比较它们及其它有用操作

  () .NET串介绍

  在.NET框架和通用语言运行时刻(CLR)以前开发者总是花费大量时间处理串例程可重用库几乎是每个C和C工具箱中部分编写在区别语言的间交换串数据代码也是相当困难例如Pascal把串存储为个内存其中个元素指示长度;而C把串存储为个具有可变长度内存末端加上个ASCII null(在C中以""表示)

  在.NET框架中串以常量方式存储这意味着当你用C#(或任何其它.NET语言)创建串时串以种固定大小存储在内存以便CLR运行更快些结果是当你实现例如连接串或修改串中单个CLR实际上是创建你多个副本

  C#中串和其它值类型例如整数或浮点数声明方式相同见下面例子:

x = "Hello World";
y;
z = x;
  ( 2) 格式化

  当使用串时最常见项任务是格式化当向用户显示信息时你经常显示如日期时间数字值十进制值货币值甚至象十 6进制数字这样内容C#串都能够显示这些类型信息甚至更多另外个强有力特征是当你使用该标准格式化工具时该格式化输出具有地区感知特征例如如果你以短格式显示个英格兰用户当前日期那么对于个美国用户来说当前日期短格式将以区别形式显示

  为了创建个格式化你仅需要Format思路方法并且传递给它个格式如下列代码所显示:

formatted = .Format("The value is {0}" value);  在此{0}占位符指示个值应该被插入位置除了指定个值应该被插入位置外你还可以指定该值格式

  其它数据类型还支持经由定制格式修饰符转换成例如DateTime数据类型通过使用如下方式它能够产生种定制格式输出:

DateTime.("format speciers");  表格1列举了用于格式化日期时间数字值等数据些最常用格式

  表格1.定制DateTime格式修饰符

修饰符 描述
d 显示某月中
dd 显示某月中其中小于10值的前加上个0
ddd 显示个星期中某 3字母缩写名
dddd(+) 显示给定DateTime值中星期中完整名
f(+) 显示秒值最重要x位数在f中格式修饰符位数越多该数字越重要这是个总秒数而不是从上个分钟以来经过秒数
F(+) 和f(+)相同除了不显示末尾零外
g 显示个给定DateTime中时代例如"A.D"
h 显示小时范围为:1~12
hh 显示小时范围为:1~12其中小于10值的前加上个0
H 显示小时范围为:0~23
HH 显示小时范围为:0~23其中小于10值的前加上个0
m 显示分钟范围为0~59
mm 显示分钟范围为0~59其中小于10值的前加上个0
M 显示月份范围为1~12
MM 显示月份范围为1~12其中小于10值的前加上个0
MMM 显示月份 3缩略名
MMMM 显示月份完整名字
s 显示秒数范围为:0~59
ss(+) 显示秒数范围为:0~59其中小于10值的前加上个0
t 显示给定时间中AM/PM指示器中
tt(+) 显示给定时间中完整AM/PM指示器
y/yy/yyyy 显示给定时间中年份
z/zz/zzz(+) 显示给定时间中时区偏移量

  让我们观察下列代码它展示使用串格式修饰符创建定制格式日期和时间串:

DateTime dt = DateTime.Now;
Console.WriteLine(.Format("Default format: {0}" dt.));
Console.WriteLine(dt.("dddd dd MMMM yyyy g"));
Console.WriteLine(.Format("Custom Format 1: {0:MM/dd/yy hh:mm:sstt}" dt));
Console.WriteLine(.Format("Custom Format 2: {0:hh:mm:sstt G\MT zz}" dt));
  下面是前面代码输出:

Default format: 9/24/2005 12:59:49 PM
Saturday 24 September 2005 A.D.
Custom Format 1: 09/24/05 12:59:49PM
Custom Format 2: 12:59:49PM GMT -06
  你还可以提供针对数字值定制格式修饰符表格2描述了适用于数字值定制格式修饰符

  表格2.数字定制格式修饰符

修饰符 描述
0 零占位符
# 数字占位符如果给定值中在#修饰符指示位置有个数字那么该数字将以格式化输出显示
. 十进制点
千分位分隔符
% 百分比修饰符被格式化值在包括到格式化输出前将乘以100
E0/E+0/e/e+0/e-0/E 科学标志
"XX"或"XX" 代表格式这些被包含在格式化输出中而不翻译其相对位置
; 用于条件格式化负数零和正值节分隔符

  如果定义多个格式节那么你可以更精确地控制数字格式化:

  · 两个节-如果你有两个格式化节则第节应用于所有正数(包括0)值第 2节应用于负数值当你想把负数值包括在括号中(就象中许多财务软件Software包中样)这是十分方便

  · 3个节-如果你有 3个格式化节则第个节应用于所有正数(不包括0)值第 2节应用于负数值第 3节应用于零

  下列代码显示如何使用定制数字格式修饰符

double dVal = 59.99;
double dNeg = -569.99;
double zeroVal = 0.0;
double pct = 0.23;
formatString = "{0:$####0.00;($####0.00);nuttin}";
Console.WriteLine(.Format(formatString dVal));
Console.WriteLine(.Format(formatString dNeg));
Console.WriteLine(.Format(formatString zeroVal));
Console.WriteLine(pct.("00%"));
  前面代码将产生如下所示输出结果:

  $59.99

  ($569.99)

  nuttin

  23%

  ( 3) 操作和比较

  除了显示包含各种格式化数据串外其它普通和串有关任务就是串操作和比较要记住个重要事情是串实际上是.NET框架基类库中个类它是个类所以实际上你可以思路方法就象你可以任何其它类上思路方法

  你可以在串常数或串变量这些思路方法见下列代码:

x = .Length;
y = "Hello World".Length;
  表格3简短列举了些你可以使用于最常用思路方法以便获得该信息或操作它

  表格3.常用串例子思路方法

思路方法 描述
CompareTo 把这个串例子和其它串例子比较
Contains 返回布尔值指示是否当前串例子包含给定子串
CopyTo 从串例子中把个子串复制到特定位置
EndsWith 返回布尔值指示是否串以个给定子串结束
Equals 指示是否该串等于另你还可以使用''操作符来代替
IndexOf 返回个子串在串例子中索引
IndexOfAny 返回串例子中在子串内任何次索引出现
PadLeft 使用特定数目空格或其它Unicode来填充特别适用于串右对齐
PadRight 把组特定空格或其它Unicode添加到最后创建串右对齐效果
Remove 从串中删除给定数目
Replace 使用特定代替内容来代替个给定串在串例子中所有出现
Split 使用特定作为分割点把当前串分解成
StartsWith 返回个布尔值指示是否该串例子以个特定串开始
SubString 给定起始点和长度情况下返回特定部分
ToCharArray 把串转换成
ToLower 把串全部转换成小写
ToUpper 把串全部转换成大写
Trim 从开始和结束位置删除组给定所有出现
TrimStart 实现Trim功能但仅从开始位置
TrimEnd 实现Trim功能但仅从结束位置

  下列代码展示了你可以使用上面相应来实现串查询和操作等:

sourceString = "Mary Had a Little Lamb";
sourceString2 = " Mary Had a Little Lamb ";
Console.WriteLine(sourceString.ToLower);
Console.WriteLine(.Format("The '{0}' is {1} chars long"
sourceStringsourceString.Length));
Console.WriteLine(.Format("Fourth word in sentence is : {0}"
sourceString.Split(' ')[3]));
Console.WriteLine(sourceString2.Trim);
Console.WriteLine("Two s equal? " + (sourceString sourceString2.Trim));
  前面代码输出如下所示结果:

mary had a little lamb
The 'Mary Had 个 Little Lamb' is 22 chars long.
Fourth word in sentence is : Little
Mary Had a Little Lamb
Two s equal? True
  ( 4) StringBuilder入门

  如前面所提及串是常量这意味着当你把两个串连接成个新串时段时间CLR在内存中有 3个因此例如当你连接实现如下代码所示连接时:

a = "Hello";
b = "World";
c = 个 + " " + c;
  实际上在内存共有 4个包括空格为了缓和这个串连接性能问题并且提供给你个工具使连接更容易些.NET框架中提供了个类StringBuilder

  通过使用StringBuilder动态地创建可变长度你克服了CLR串中常量串这事实;而且这样以来该代码变得更具可读性下列代码展示了StringBuilder使用:

StringBuilder sb = StringBuilder;
sb.Append("Greetings!
");
formatString = "{0:$####0.00;($####0.00);Zero}";
dVal = 129.99;
sb.AppendFormat(formatString dVal);
sb.Append("
This is a big concatenated .");
Console.WriteLine(sb.);
  前面代码输出如下所示结果:

Greetings!
$129.99
This is a big concatenated .
  注意前面代码中" "把个换行符插入到串中

   2、 使用正规表达式

  正规表达式允许快速有效地处理文本被处理文本小到个电子邮件地址大到个多行输入框内容正规表达式使用不仅允许你使用个定义模式来校验文本而且还允许你从匹配个给定模式文本中提取数据

  你可以把个正规表达式当作是种特别强有力通配符当我们看到象"SAMS*"这样表达式时我们都会熟悉通配符任何以单词SAMS开头内容都是个匹配表达式正规表达式能为你提供远远超过通配符强有力控制功能

  本节先向你简短地介绍下.NET框架中提供支持使用正规表达式有关正规表达式更多信息你可以参考正规表达式快速参考手册精通正规表达式第 2版这些书将提供给你需要信息以便创建你自己正规表达式而且还提供了常用正规表达式组列表至于正规表达式本身已经超出本文讨论范围

  () 校验输入

  正规表达式种最常用场所是用于使用些预先定义格式(例如强制建立规则用于确保口令中包含特定使其很难被拆断)校验用户输入这些规则被典型地定义为正规表达式正规表达式也常用于校验简单输入例如电子邮件地址和电话号码

  .NET框架提供操作正规表达式个关键类是RegEx类这个类提供个静态思路方法IsMatch它返回个布尔值指示是否指定输入串匹配个给定正规表达式

  在下列代码中使用个普通正规表达式来测试电子邮件地址有效性:

emailPattern = @"^([w-.]+)@(([[0-9]{13}.[0-9]{13}.[0-9]{13}.)|[ccc]
(([w-]+.)+))([a-zA-Z]{24}|[0-9]{13})(]?)$";
Console.Write("Enter an e-mail address:");
emailInput = Console.ReadLine;
bool match = Regex.IsMatch(emailInput emailPattern);
(match)
 Console.WriteLine("E-mail address is valid.");

 Console.WriteLine("Supplied input is not a valid e-mail address.");
  如果你搞不清楚这个正规表达式别担心电子邮件模式基本思想是它需要些数字字母后面跟着个@符号然后是组合再后面跟着个"."再往后至少跟着两个你可以以区别输入试验前面代码来看下你得到什么结果即使你不理解该正规表达式本身只要知道它们存在那么你就可以把它使用于你应用中来校验输入

  ( 2) 从输入中提取数据

  正规表达式其它常见使用方法是根据表达式分析文本以及使用的来从用户输入中提取数据(称作组匹配)

  正规表达式中包括个特征叫组个组允许你把个命名标识放到该正规表达式个特定节中当你Match来针对模式比较输入数据时其结果实际上把匹配分成些组允许你提取匹配每个组输入部分

  例如在前面例子中我们创建了个username它允许我们提取在个电子邮件地址中位于@符号前所有数据然后当执行个匹配时我们能够使用正规表达式命名组从输入中提取该username

  下列代码显示怎样从个用户在控制台输入URL中提取协议名字和端口号正规表达式伟大在于它们使用自己语言;因此它们不必依赖于C、C、C#、VB.NET或任何其它语言在下列代码中正规表达式来自于个MSDN例子:

urlPattern = @"^(?<proto>w+)://[^/]+?(?<port>:d+)?/";
Console.WriteLine;
Console.Write("Enter a URL for data parsing: ");
url = Console.ReadLine;
Regex urlExpression = Regex(urlPattern RegexOptions.Compiled);
Match urlMatch = urlExpression.Match(url);
Console.WriteLine("The Protocol you entered was " + urlMatch.Groups["proto"].Value);
Console.WriteLine("The Port Number you entered was " + urlMatch.Groups["port"].Value);
  当你使用不带有个端口号URL运行前面代码时你会注意到你没有得到任何组值这是该输入根本不匹配正规表达式当不存在匹配时你显然无法从给定组中提取有意义数据当你使用匹配该正规表达式端口号URL运行前面代码时你将得到如下列文本所示输出结果:

Entera URL for data parsing: http://server.com:2100/home.aspx
The Protocol you entered was http
The Port Number you entered was :2100
   3、 整理总结

  在本文中你已看到现在你有了自己串例程库借助于C#和.NET框架串成为该基类库个本机组成部分并且提供给你大量工具思路方法用于实现比较操作格式化等操作你还看到StringBuilder类向你提供了组易于使用工具思路方法以便动态地构建串而不会带来本地串连接性能损失

  最后本文向你简短介绍了正规表达式威力以及Regex类是如何把这些功能整合到通过阅读本文和试验相应举例代码后你应该熟悉串和正规表达式操作以使你应用更为有力

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: