- 历史:它不是一项新技术,它最初是在UNIX环境中开发的。
- 相关命名空间:System.String,System.Text.RegularExpression,貌似还有很多呢。
介绍一些类:
Regex(REGularEXpressions)类的静态方法Matches 顾名思义,返回一个MatchCollections对象,可以用System.Text.RegularExpressions.Match类对象迭代它。
想做这么个实例:做一个字符串集合,直接将pattern写在索引里头就能定位子字符串了。即: substrings=strs[@”\ba“];
//直接看代码中注释,应该能明白我意思,
class Program { static void Main(string[] args) { MyStringCollection strs = new MyStringCollection(10); strs.Strs = new string[] { "acb", "decf", "ghi", "opq" }; DisPlayStringArray (strs[@"\Bc\B"]); //并为实现下面模式匹配后修改 //strs[@"\Bc\B"] = "new "; //DisPlayStringArray(strs[@"\Bc\B"]); } public static void DisPlayStringArray(string [] strs) { foreach (string s in strs) Console.WriteLine(s); } } class MyStringCollection { private string[] strs; public string[] Strs { get { return strs; } set { strs = value; } } public MyStringCollection(int counter) { strs = new string[counter]; } public string this[int index] { get { return strs[index]; } set { strs[index] = value; } } #region 这里用重载索引,希望让客户代码更舒服 public string[] this[string pattern] { get { string[] tempStrs = new string[strs.Length];//这里简单的使用strs的长的初始化 for (int i = 0, j = 0; i < tempStrs.Length; i++) { Match m = Regex.Match(strs[i], pattern); if (m.Success == true) { tempStrs[j] = strs[i]; j++; } } //上面得到的是一个有空元素的tempStrs,下面代码要将其空元素去除 //首先得到字符数组真实的length int length = 0; for (; length < tempStrs.Length; length++) { if (tempStrs[length] == null) { break; } } //用于实例化最后返回的数组 string[] lastStrs = new string[length]; //初始化最后数组 for (int i = 0; i < lastStrs.Length; i++) { lastStrs[i] = tempStrs[i]; } //返回 return lastStrs; } set { } } #endregion }
正如代码中注释写的的那样,
我并没有实现 strs[parttern]=”a str”这种直接将原strs中匹配的字符串替换为“a str” ,
因为我写的索引类型是string [](当时考虑到既然是匹配自然会返回多个string对象),所以给这个索引赋值也要给它一个字符数组,即:new string[]{“a str”},
这违背了我希望客户代码写的舒适的初衷,故我考虑是否可以重载转换运算符,即: strs[pattern]=”a str” (“a str” 内部自动转换为string[]),
但是这也抛出了另一个不好之处,我客户代码可能只是strs[0]=“a str”,而将”a str ”转换成数组在赋值与strs[0]显然不对。
于是抛出问题:能否重载只针对某个过程?只针对某种操作,不同操作同一个运算符可以表现出不同的功能?
未完明天继续…
-------------------------------------------------------------------------------------------------------------------------
继续昨天,
首先解决昨天的问题:
“操作符重载,对于clr来说,它甚至不知道有这么回事,而是:编程语言定义每个操作符的含义,然后生成对应的代码,虽然clr对操作符重载一无所知,但它规定了编程语言如何对外提供操作符重载,以便另一种不同的编程语言可以容易地使用这些操作符。
c#语言和其他语言都要求参数或者返回类型与定义重载方法的类型一致,这约束的原因在于它能是c#编译器在合理的时间内找到要绑定的操作符方法。”
小结:重载就是针对某个转换过程的。由编译器选择生成调用哪个重载方法。
我发现需要增加string类的隐式转换的重载方法,方可让我轻松的将“a str”赋值给 一个string strs[0] 和另一个string[] strs[pattern]
故抛出问题:怎么才能修改string类呢?因为知道有拓展方法这回是,所以心想,既然可以拓展一个类的方法,应该也能拓展一个类的转换方法吧?这样这个类变有了“学习”的能力了。
有点偏离正则问题了…
先回归一下正则:
pattern是用来匹配你想找的那个词的!而不是匹配整个text,从中找出符合pattern的词。
例子:text=”abc ff abc” pattern=@”\Bf\B”
本意可能是想匹配ff,但是却匹配不到。
ff不是在text的中间吗?不是符合我的pattern吗?
匹配规则:将text中的每个单词(用标点符号分开的)依次拿出来匹配pattern
所以ff这个词不符合符合pattern,因为两个f都是在边界,所以上述匹配不到结果。