加龙

加龙加香不加价
随笔 - 133, 评论 - 1344 , 引用 - 51

2006年10月24日

C#中的正则表达式对象

         C#中,.NET为我们提供了一个System.Text.RegularExpression命名空间,包含了一些我们常用的操作和运用RegularExpression的对象,属性和方法。其中相当重要的有Regex,Match,Group,Capture等对象。
         我们可以来看看这些对象之间有什么联系和区别,并学习在实际中运用它们。
 
说明
表示单个子表达式捕获中的结果。Capture表示单个成功捕获中的一个子字符串。
表示一个捕获子字符串序列。CaptureCollection返回由单个捕获组执行的捕获的集合。
Group表示单个捕获组的结果。由于存在数量词,一个捕获组可以在单个匹配中捕获零个、一个或更多的字符串,因此 Group 提供 Capture 对象的集合。
表示捕获组的集合。GroupCollection返回单个匹配中的捕获组的集合。
表示单个正则表达式匹配的结果。
表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合。
表示不可变的正则表达式。
提供编译器用于将正则表达式编译为独立程序集的信息。
 
首先我们接触到的就是Regex对象,表示不可变的正则表达式。另外Regex类包含若干静态方法,使您无需显式创建 Regex 对象即可使用正则表达式。使用静态方法等效于构造 Regex 对象,使用该对象一次然后将其销毁。
例如:
我们可以通过Regex的构造函数创建对象:
Regex objRegex = new Regex();
或者通过静态方法直接运用:
string strTarget= "123abc456def789g";
                   string strRegex = @"\d+";
    Console.WriteLine((System.Text.RegularExpressions.Regex.Matches(strTarget,strRegex)).Count);    
         以上就是直接通过静态方法的实例。
 
         运用RegularExpression就不可能不涉及到匹配。Match表示单个正则表达式匹配的结果。这一点不用解释,以
string strTarget= "123abc456def789g";
                   string strRegex = @"\d+";
    Console.WriteLine((System.Text.RegularExpressions.Regex.Matches(strTarget,strRegex)).Count);    
为例,一个Match可能就是123
 
         由于单个匹配可能涉及多个捕获组,因此 Match 具有返回 GroupCollection Groups 属性。GroupCollection具有返回每个组的访问器。Match Group 继承,因此可以直接访问匹配的整个子字符串。 Match 实例本身等效于 Match.Groups[0](在 Visual Basic 中为 Match.Groups(0))。Match对象是不可变的,并且没有公共构造函数。
         这里衍生出一个新的对象----GroupGroup表示单个捕获组的结果。在C#RegularExpression中用圆括号括起来表示一个捕获组。看例子:
string strTarget= "123abc456def789g";
string strRegex1 = @"\d+([a-z])+";
Console.WriteLine(Regex.Match(strTarget,strRegex,RegexOptions.IgnoreCase).Groups.Count);
这里用([a-z])来捕获单个英文字符。这就是一个捕获组。所以这里GroupsCount就是2个,Groups[0]等效于Match实例本身。Groups[1]’C’
由于存在数量词,一个捕获组可以在单个匹配中捕获零个、一个或更多的字符串,因此 Group 提供 Capture 对象的集合。
Capture,顾名思义,就是一次捕获,还是以上面的正则表达式例子:
Console.WriteLine(Regex.Match(strTarget,strRegex1,RegexOptions.IgnoreCase).Groups[1].Captures.Count);
通过输出我们可以看见有3Capture,如果我们都打印出来会发现分别是a,b,cGroups[1]保留了最后一次捕获。
至此,我们可以大概了解了。这些常用对象。
至于如何运用,还是要视具体情况,正则表达式主要用以处理文本,如果机会合适还是可以节约很多工作量的,推荐大家使用。
也欢迎大家就这方面继续深入和我讨论。
 

posted @ 10:02 | Feedback (12)

.Net中Hashtable的应用

.Net中Hashtable的应用
每个元素是一个存储在 DictionaryEntry 对象中的键/值对。键不能为空引用(Visual Basic 中为 Nothing),但值可以。
用作 Hashtable 中的键的对象必须实现或继承 Object.GetHashCode 和 Object.Equals 方法。如果键相等性只是引用相等性,这些方法的继承实现将满足需要。此外,如果该键存在于 Hashtable 中,那么当使用相同参数调用这些方法时,这些方法必须生成相同的结果。只要键对象用作 Hashtable 中的键,它们就必须是永远不变的。
当把某个元素添加到 Hashtable 时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。
Hashtable 的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子 1.0 通常提供速度和大小之间的最佳平衡。当创建 Hashtable 时,也可以指定其他加载因子。
当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到此加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。
Hashtable 中的每个键对象必须提供其自己的哈希函数,可通过调用 GetHash 访问该函数。但是,可将任何实现 IHashCodeProvider 的对象传递到 Hashtable 构造函数,而且该哈希函数用于该表中的所有对象。
1、?遍历Hashtable的键值对:
方案一:
Hashtable myHT = new Hashtable();
????? myHT.Add("First", "Hello");
????? myHT.Add("Second", "World");
????? myHT.Add("Third", "!");
????? IDictionaryEnumerator myEnumerator = myHT.GetEnumerator();
????? Console.WriteLine( "\t-KEY-\t-VALUE-" );
????? while ( myEnumerator.MoveNext() )
?????? {
???????????? Console.WriteLine("\t{0}:\t{1}", myEnumerator.Key, myEnumerator.Value);
?????? }
?????
结果如下:
-KEY-??? -VALUE-
??? Third:??? !
??? Second:??? World
??? First:??? Hello
方案二:
foreach(Object obj in myHT.Keys)
{
?Console.Write
Line("\t{0}:\t{1}", (string)obj , myHT[obj ]);
}
方案三:
foreach(DictionaryEntry de in myHT ) //myHT 为一个Hashtable实例
???{
????Console.WriteLine(de.Key);//de.Key
对应于key/value键值对key
????Console.WriteLine(de.Value);//de.Key
对应于key/value键值对value
???}
2、?实现可排序的Hashtable
原本以为需要自己实现,经讨论发现微软已有类似功能的类库SortedList
SortedList 在内部维护两个数组以将数组存储到列表中;即,一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为 DictionaryEntry 对象进行访问的键/值对。键不能为空引用(Visual Basic 中为 Nothing),但值可以。
SortedList 的容量是列表可拥有的元素数。随着向 SortedList 中添加元素,容量通过重新分配按需自动增加。可通过调用 TrimToSize 或通过显式设置 Capacity 属性减少容量。
SortedList 的元素将按照特定的 IComparer 实现(在创建 SortedList 时指定)或按照键本身提供的 IComparable 实现并依据键来进行排序。不论在哪种情况下,SortedList 都不允许重复键。
索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入 SortedList,同时索引会相应地进行调整。若移除了元素,索引也会相应地进行调整。因此,当在 SortedList 中添加或移除元素时,特定键/值对的索引可能会更改。
由于要进行排序,所以在 SortedList 上操作比在 Hashtable 上操作要慢。但是,SortedList 允许通过相关联键或通过索引对值进行。

posted @ 10:00 | Feedback (1)

京ICP备 05050892号