20131125-序列化与正则表达式

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();

posted @ 2014-01-20 21:28  几维  阅读(699)  评论(0编辑  收藏  举报