2013/11/25 已经存入代码库
[1]序列化
1.1概念:对象序列化是将对象(比如Person对象)转换为二进制数据(字节流),反序列化是将二进制数据还原为对象。
对象序列化,只能针对对象的字段进行序列化。
1.2关于二进制序列化需要注意的事项:
-
1.要序列化的类型必须标记为:[Serializable]
-
2.该类型的父类也必须标记为: [Serializable]
-
3.该类型中的所有成员的类型也必须标记为: [Serializable]
-
4.序列化只会对类中的字段序列化。(只能序列化一些状态信息。)NonSerialized
-
5.不建议使用自动属性。(每次生成的字段都可能不一样,影响反序列化)
1.3一个类两个方法一个关键字
BinaryFormatter类
void Serialize(Stream stream, object graph)对象graph序列化到stream中
object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象
[Serialize]
[code]
//序列化
static void Main(string[] args)
{
//Person p = new Person();
Student s = new Student();
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs=new FileStream("1.txt",FileMode.Create,FileAccess.Write))
{
bf.Serialize(fs,s);
}
Console.WriteLine("OK");
Console.ReadKey();
}
//反序列化
BinaryFormatter bf = new BinaryFormatter();
//创建一个流
using (FileStream fs = new FileStream("1.txt", FileMode.Open, FileAccess.Read))
{
//这个方法需要一个流
object obj= bf.Deserialize(fs);
Person per = (Person)obj;
Console.WriteLine(per.Age);
}
[2]正则表达式
概念:用以描述或匹配某一符号集的字符串。
用途:正则表达式通常被用来检索、替换那些符合某个模式的文本。
[*]可不可以将这个概念用以地图制作或实体搜索?或者能不能将这个思想用于地图制作或实体搜索。
普通字符---普通几何图元
元字符---元图元
--.:描述除\n之外的任何单个字符。
--[ ] :描述括号中的任何一个字符(范围,字符集合)。
--| :描述逻辑"或"运算关系。
--( ) :把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
限定符:限定前面的正则表达式出现的次数。
--*:描述前面的子表达式重复零次或多次。和通配符*没关系。等价于{0,}。
--+ :描述前面的子表达式重复一次或多次。等价于{1,}。
--? :描述前面的子表达式零次或一次。等价于:{0,1}。
--{n} :描述确定的 n 次。"zo{2}"→zoo。
--{n,} :至少描述n次。
--{n,m} :描述最少出现 n 次且最多出现 m 次。
--^(shift+6) :定义开始模板(或称匹配一行的开始)。
例如正则表达式"^regex"能够匹配字符串"regex我会用"的开始,但是不能匹配"我会用regex"。(模板:^regex________)
^另外一种意思:非!([^0-9])
--$ :定义结束模板(或称匹配行结束符)。
例如正则表达式"浮云$" 能够匹配字符串"一切都是浮云"的末尾,但是不能匹配字符串"浮云呀"。(模板:_______浮云)
--\d:代表一个数字,等同于[0-9] \\d →\d
--\D:代表非数字,等同于[^0-9]
--\s:描述{换行符、Tab制表符等空白字符} ,(空格、回车、制表符)
--\S:代表非空白字符(a0%$@@)
--\w:匹配描述{字母或数字或下划线或汉字},即能组成单词的字符,除%&#@!$等字符。[a-zA-Z0-9_汉字] (unicode字符)
--\W:非\w ,等同于[^\w] %
--\b:单词的边界。
d:digital;s:space、w:word。大写就是"非"
-
对于元字符,限定符等,如果要匹配字符本身都需要转义:
-
\*、\+、\.、\[、\-、\{2,3}、\\d...
[*]正则表达式应用——实例应用
技巧:简单记忆,复杂分步分组
1.验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
2.验证固定电话号码:("^(\d{3,4}\-?)\d{7,8}$")或("^(\d{4}-?|\d{3}-?)(\d{8}|\d{7})$")
正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;xxx/xxxxxxxxxxx/xxxxxxxx
3.验证手机号码:"^1[3|4|5|8][0-9]\\d{8}$";
4. 验证身份证号
-
1.长度为15位或者18位的字符串,首位不能是0。
-
2.如果是15位,则全部是数字。
-
3.如果是18位,则前17位都是数字,末位可能是数字也可能是X。
写法一:^[1-9][0-9]{14}([0-9]{2}[0-9Xx])?$
写法二: ^([1-9][0-9]{14}|[1-9][0-9]{16}[0-9X])$
5.验证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
写法二:([0-9a-zA-Z_.-]+)@([0-9a-zA-Z-]+(\.[a-zA-Z]+){1,2})
6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$") ;
7.整数或者小数:(-?\d+)(\.\d+)? 整数:-?\d+
8.只能输入数字:"^[0-9]*$"。
9.只能输入n位的数字:"^\d{n}$"。
10.只能输入至少n位的数字:"^\d{n,}$"。
11.只能输入m~n位的数字:"^\d{m,n}$"。
12.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
13.只能输入有两位小数的正实数:"^[0-9]+(\.[0-9]{2})?$"。
14.只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?$"。
15.只能输入正整数:"^\+?[1-9][0-9]*$"。 正整数:大于0的整数
16.只能输入负整数:"^\-[1-9][0-9]* $"。 负整数:小于0的整数
17.只能输入长度为3的字符:"^.{3}$"。
18.只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
19.只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
20.只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
21.验证是否含有^%&‘,;=?$\"等字符:"[^%&‘,;=?$\x22]+"。
22.只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"。
23.验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
24.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
25.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
26.获取日期正则表达式:\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?
评注:可用来匹配大多数年月日信息。
27.匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
28.匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
版本二:
HTML标记(包含内容或自闭合):<(.*)(.*)>.*<\/\1>|<(.*) \/>
30.匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
31.匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
33.匹配腾讯QQ号:[1-9]\d{4,}
评注:腾讯QQ号从10 000 开始
34.匹配中国邮政编码:[1-9]\d{5}
评注:中国邮政编码为6位数字
35.匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
36. 密码(由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上)
(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$
37. 不包含abc的单词:\b((?!abc)\w)+\b
说明:正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\b而不是^和$。
.+------------任意字符
教程: http://deerchao.net/tutorials/regex/regex.htm#mission
bool result = Regex.IsMatch(str, "^1[1-9]$");//完全匹配
提取邮箱:
static void Main(string[] args)
{
WebClient wc = new WebClient();
string str = wc.DownloadString("http://localhost:8080/留下你的Email.htm");
MatchCollection mat = Regex.Matches(str, @"([0-9a-zA-Z_.-]+)@([0-9a-zA-Z-]+(\.[a-zA-Z]+){1,2})");
//DownloadFile
foreach (Match item in mat)
{
if (item.Success)
{
Console.WriteLine(item.Groups[0].Value + "===" + item.Groups[1].Value + "===" + item.Groups[2].Value);
}
}
Console.WriteLine(mat.Count);
Console.ReadKey();
}
路径中提取文件名
//c:\windows\testb.txt中提取出testb.txt
string path = @"c:\windows\testb.txt";
// Match mat = Regex.Match(path, @".+\\.+");//贪婪模式+//全部路径匹配
Match mat = Regex.Match(path, @"^.+\\(.+)$");//提取文件名
// Console.WriteLine(mat.Value);
// Console.ReadKey();
Console.WriteLine(Regex.IsMatch(path, @"^.+\\.+$"));
if (mat.Success)
{
Console.WriteLine(mat.Groups[1].Value);
}
Console.ReadKey();