常用正则表达式 

常用正则表达式
Programming

  正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式
[ view entry ] [ 0 引用 ] 永久链接 related link
程序就像诗 

学了这么久的计算机,当我真正能静下心来写代码的时候。我慢慢的体会到很多曾经未曾感受的感觉。
说实话我对文学完全不在行,特别是对诗歌,曾经为从前的女友写过一些,但是她最终离开了。现在想起来那时候写的也不过是一些顺口溜。当我开始写程序的时候,我慢慢的感觉到诗歌的感觉。美丽的程序就好像美丽的诗篇。
函数名就好像标题。函数中的断行和空格就好像是不同诗歌的结构。那些流动的代码,也好像乐谱一样在调试器里面滚动。慢慢的,觉得程序能融入人的生活。对于写程序的人来说,我还远远不是很在行。但是每次写程序我都有新的感悟。大道至简,一个好的程序也是这样。多一个语句程序就会变的痈肿,少一个语句就会变得功能不全。就好像诗中的美感。慢慢的,你就会陶醉其中。
[ view entry ] ( 1 次浏览 ) [ 0 引用 ] 永久链接
使用ekhtml简介 

ekhtml是一个非常简单的html解析库,不但可以解析html而且对于xml也有一定的解析效果。鉴于没有前国内还没有这个简单的库的教程,所以我把学习体会写在下面,供新人参考。

1.安装
1.1 下载
安装ekhtml除了在官方网站下载之外,你还可以在cvs上面下载。在你的Unix/Linux主机上面安装cvs之后执行下面的命令:

cd ~
cvs -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml login
cvs -z3 -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml co -P ekhtml

1.2 编译
1.进入ekhtml的目录
2.执行 ./autogen.sh
3.执行 make
4.用root身份执行 make install

这样就完成了安装。
2.ekhtml使用
2.1 数据
1.struct ekhtml_string_t
这是ekhtml的字符串,这个字符串没有'\0'字符作为结尾。但是它包含两个成员: *char str ,和一个 int len。
1.struct ekhtml_attr_t
对象属性,其实可以用对象属性作为一个列表。
对象属性里面有四个字段:name,val 是ekhtml_string_t类型的。isBoolean是个unsigned int类型。最后一个字段指向下一个属性。

2.2 一些Typedefs
typedef ekhtml_string_t ekhtml_string_t;
typedef ekhtml_attr_t ekhtml_attr_t; //这两个类型上面已经说过了
typedef ekhtml_parser_t ekhtml_parser_t;
//parser_t的对象保存了一些状态信息,比如读到了一个标签,要调用什么函数来进行处理。多少数据开始处理等等。

2.3 回调函数
typedef void(* ekhtml_data_cb_t )(void *cbdata, ekhtml_string_t *data);
typedef void(* ekhtml_starttag_cb_t )(void *cbdata, ekhtml_string_t *tag, ekhtml_attr_t *attrs);
typedef void(* ekhtml_endtag_cb_t )(void *cbdata, ekhtml_string_t *tag);

上面这几个函数,我放到一起说明。如果我们要处理一个页面,那么这个页面也许会是这样:

<html>
<head>
<title>测试页面</title>
</head>
<body>
页面信息!
</body>
</html>


被"<>"包围的内容是 ekhtml_starttag_cb_t 所要处理的内容。我们可以定义一个函数:

static void handle_starttag(void *cbdata, ekhtml_string_t *tag,
ekhtml_attr_t *attrs);

第一个参数是你处理出来的数据,也就说是个返回结果。
第二个参数是个字符串,也可以是NULL。是字符串说明你要解析的标签名,NULL会处理所有你没有指定标签名的标签。
第三个参数,负责返回标签属性。

在</ >中间的内容是标签结束 ekhtml_endtag_cb_t 会处理它们。 参数和第一个比只是少了最后标签属性。

比如“测试页面”,“页面信息!”这样的字是标签数据。你自己定义的ekhtml_data_cb_t会处理这些东西。

我们可以定义一些类似这样的函数来处理我们的页面。那么如何把这些回调函数关联到我们的解析里面呢?

2.4 如何解析
首先要 ekhtml_parser_new 新建一个parser对象,然后执行下面的代码:

ekhtml_parser_datacb_set();
ekhtml_parser_commentcb_set();
ekhtml_parser_startcb_add();
ekhtml_parser_endcb_add();
ekhtml_parser_cbdata_set();

第一个函数和第二个函数处理数据和注释。这些函数的作用是把你定义的回调函数绑定到你指定的ekhtml_parser_t 类型的对象上面。

当你完成了绑定,你就可以去处理网页了。比较简单的处理方式是:

while()
{
fread(...); //读你的文件 标准函数没啥说的了。
//在这里运行
ekhtml_parser_feed(); //这里就是解析 这里是解析传进来的部分,和下面一句配合。通过fread可以把数据组合在一起
ekhtml_parser_flush(); //刷新缓冲 第一个参数是 parser 第二个参数如果是true 就强制刷新
}


这最后我们强制刷flush一下后就ekhtml_parser_delete

这就是整个解析过程。

3 参考资料
http://ekhtml.sourceforge.net/docs/index.html
http://ekhtml.cvs.sourceforge.net/ekhtm ... iew=markup

[ view entry ] [ 0 引用 ] 永久链接
[转帖][整理] 用VC6进行UNICODE编程 


最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。

1. 添加 UNICODE 和 _UNICODE 预处理定义

位置:Project Settings -> C/C++ -> Preprocessor definitions

添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)

2. 使用宽字符相关类型,如:

char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR

3. 对字符串常量使用 _T() 宏

4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等

类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等

5. 将 Project Settings -> Link -> Output -> Entry Point 设为 wWinMainCRTSTartup

否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本

可在StdAfx.h中:

#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif

然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等

7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:

CString s = _T("ABC");
ASSERT(s[0] == 'A');

8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用 MultiByteToWideChar 和 WideCharToMultiByte
[ view entry ] [ 0 引用 ] 永久链接 related link
[LUPA学习向导]如何成为Linux平台C语言程序员 

[LUPA学习向导]如何成为Linux平台C语言程序员

目标:
成为合格的Linux平台C语言程序员
技能:
掌握C语言基本语法,掌握Linux平台系统调用,熟悉Linux平台开发流程,掌握anjuta以及glade使用方法,了解kernel结构编写高质量程序。

步骤:
1、学习C语言语法
预计时间:30天
参考书籍
http://man.lupaworld.com/content/develo ... m_lang.zip

2、学习linux平台系统调用
预计时间:30天
参考书籍
http://man.lupaworld.com/content/develo ... efault.htm

3、提高C编程技能
预计时间:30天
参考书籍
http://man.lupaworld.com/content/develo ... m_idea.zip
http://man.lupaworld.com/content/develo ... answer.zip

4、学习开发流程
预计时间:30天
参考书籍
http://man.lupaworld.com/content/manage ... nuxdev.htm

5、学习图形界面编程初步
预计时间:30天
参考书籍
http://www.scivoid.net/doc/gtk/glade/

6、了解linux,了解kernel
预计时间:50天
参考书籍
http://man.lupaworld.com/content/develop/joyfire/

更多电子书请查看 http://man.lupaworld.com/

参与讨论交流请进入 http://www.lupaworld.com/bbs/forum-242-1.html
[ view entry ] [ 0 引用 ] 永久链接 related link

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 下一页> >>