C# 基础之一
一.c#使用静态成员
类的方法和属性可以是实例成员也可以是静态成员。实例成员与某类型的实例有关,而静态成员则是类的一部分。
例:
一个名为Button的类,实例化该类生成了名为btnUpdate和btnDelete的对象。静态方法SomeMethod(),要访问此方法要写:Button.SomeMethod();
在C#中通过实例访问静态方法或成员变量是不合法的。
C#中不存在全局方法,只有类方法,但可以在类中定义静态方法达到类似的效果。
在C#中,static关键字表示一个类成员。
静态方法可以在没有实例的情况下调用它们,名字作用域仍然在类中,类名很像命名空间。
静态方法可以接受实例成员作为参数,它的作用域在类中,而不是全局,它可以访问实例的私有成员。//它指实例成员参数
静态方法是在类上而不是在类的实例上操作,它们没有this引用
静态方法不能直接访问非静态成员,如果Main()要调用非静态方法,它必须实例化一个对象。
二《JavaScript高级程序设计》笔记之'正则表达式'
正则表达式是具有特殊语法的字符串,用来表示指定字符串在另一个字符串中出现的情况。
JavaScript对正则表达式的支持是通过ECMAScript中的RegExp类实现的。
1.RegExp对象:
RegExp对象的方法有test()和exec()。属性有g,i,m,lastMatch等。
2.定义方式:
var reCat=new RegExp("cat","gi"); //"g"是global,"i"是case-insensitive
也可以用Perl风格的语法:
var reCat=/cat/gi;
3.元字符
正则表达式用到的所有元字符:( [ { \ ^ $ | ) ? * +
元字符是正则表达式语法的一部分,任何时候要在正则表达式中使用它们,都必须对它们进行转义。如:
var reQMark=/\?/;
或者:var reQMark=new RegExp("\\?"); //注意:这里使用双重转义,以防解析器按\n方式翻译
4.字符类
(1) 简单类
var sToMatch="a bat, a Cat, a fAt baT, a faT cat";
var reBatCatRat=/[bcf]at/gi; //匹配b、c或f
alert(sToMatch.match(reBatCatRat)); //outputs "bat,Cat,fAt,faT,cat" //String对象的match()方法
(2) 负向类
var sToMatch="a bat, a Cat, a fAt baT, a faT cat";
var reBatCatRat=/[^bc]at/gi;
alert(sToMatch.match(reBatCatRat)); //outputs "fAt,faT"
(3) 范围类
var sToMatch="num1,num2,num3,num4,num5,num6,num7,num8";
var reOneToFour=/num[1-4]/gi;
alert(sToMatch.match(reOneToFour)); //outputs "num1,num2,num3, num4"
(4) 组合类
由几中其他类组合成的字符类,如:[a-m1-4\n]。
(5) 预定义类
主要有数字\d(也可表示成[0-9]),空白字符\s,单词\w和\D,\S,\W 如:
var sToMatch="564 891 abc";
var reThreeNums=/\d\d\d/;
alert(reThreeNums.test(sToMatch)); //outputs "true" //RegExp对象的test()方法
5.量词
(1) 简单量词
简单量词包括?,*,+,{n},{n,m},{n,}。举例:
如果想匹配bread,read,red,可以这样:
var reBreadReadRed=/b?rea?d/;
又如想匹配bead,baed,beed,baad,bad,bed,可以这样:
var reB=/b[ea]{1,2}d/;
(2)贪婪的、惰性的、支配性的量词
例如单独一个问号(?)是贪婪的,(??)是惰性的,(?+)是支配的。
贪婪量词先看整个字符串是否匹配。如果不匹配,则去掉该字符串中最后一个字符,并再次尝试。
惰性量词先看字符串中的第一个字母是否匹配,如果不匹配,就继续读入下一个字符。
支配量词只尝试匹配整个字符串。
区别三者,举例:
var sToMatch="abbbaabbbaaabbb1234";
var re1=/.*bbb/g;
var re2=/.*?bbb/g;
var re3=/.*+bbb/g;
如果想匹配"abbb","aabbb"和"aaabbb"只能是re2(第一个"abbb"匹配之后,继续向匹配)。
6.分组
如:var reDogDog=/(dog){2}/g;
等同于 var reDogDog=/(dog)\1/; // "dogdog"
(1) 捕获性分组(反向引用)
举例:调换字符串中两个单词的顺序:
var sToChange="1234 5678";
var reMatch=/(\d{4}) (\d{4})/;
var sNew=sToChange.replace(reMatch,"$2 $1");
alert(sNew); //outputs "5678 1234";
(2) 非捕获性分组
非捕获性分组不创建反向引用,也就避免了存储反向引用带来的速度降低的问题。应用举例:
var reTag=/<(?:.|\s)*>/g;
7.候选
如何匹配"red"和"black"呢?
var sToMatch1="red";
var sToMatch2="black";
var reRedOrBlack=/(red|black)/;
alert(reRedOrBlack.test(sToMatch1)); //outputs "true"
alert(reRedOrBlack.test(sToMatch2)); //outputs "true"
8.前瞻
用"?="表示,如:
var sToMatch1="bedroom";
var sToMatch2="bedding";
var reBed=/bed(?=room)/;
alert(reBed.test(sToMatch1)); //outputs "true"
alert(reBed.test(sToMatch2)); //outputs "false"
9.边界
表示边界的符号有^,$,\b,\B。
10.多行模式(IE不支持)
在正则表达式的后面加一个m.如返回每行结尾的单词:
var sToMatch="First second\nthird fourth\nfifth sixth"
var reLastWord=/(\w+)$/gm;
alert(sToMatch.match(reLastWord)); //outputs "second,fourth,sixth"