gcc和VC的部分区别

gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。  1 声明64位数据类型:gcc:  long longvc: __int64  2 switch语法中的case语句:gcc: case ‘0’ … ‘9’vc: case 0:     case1:      … 3 寄存器变量的作用范围:gcc:  可以把register变量声明为全局或局部的vc: 只能是局部变量 4 有符号和无符号整形:gcc:  在常量数字后面加LL或ULL,例如: 无符号:0xffffffffffffffffULL 有符号:0xffffffffffffffffLLvc: 在常量数字前加强制转换。例如: 无符号:(uint64_t)0xffffffffffffffff 5 宏变参gcc: #define AAA(x…) vc: 不支持,在实际中碰到此类问题时只能根据代码分析实际情况将它分解成若干个宏 6 对数组中指定元素的初始化:gcc: static int array[100] = {       [10] = 10, /* array[10] = 10; */      [20] = 20, /* array[20] = 20; */ } 功能:通过这种方法,可在数组的声明当中就初始化指定元素的值,除了arrar[10]和array[20]外,其余元素会自动初始化为默认值,这给我们带来了一种很简捷的办法,这功能是不是很酷? vc: 不支持,只能通过在指定元素前后填充0或另外写一个初始化函数来实现。如初始化函数可以这样写: void init_array() {  array[10] =… Continue reading gcc和VC的部分区别

网络上的常用相册是网盘

相册类: Flickr imageshack.us 163.com google picasa yupoo poco 网盘: sharebig humyo namipan code.google.com skydrive live-share megaupload  

PowerShell删除某个目录下的指定的文件或者目录

从svn拉下来的东西,但是想要脱离svn的管辖了。目录中有很多svn的东西很不爽。决定删除,试用了一下powershell,很方便。 1.cd 到该目录下。 2.get-childitem -Recurse -Force -Include .svn | remove-item -Force -Recurse  

nLite(From Deepin)

Nlite后期处理技术小结(第三次更新…全文完) 用了一段时间的Nlite,同时也在网上收集了不少的经验,在自己做出最适合自己或帮人装机的XP后,也不想保留后期处理技术了,留给后来的Nlite使用者,免得走弯路,研究后期的大多都保留自己的技术吧,偶觉得没有意思,想想吧,如果以前雨浪不公布他的经典方法,现在不知道多少人还在走弯路。以后没有必要再研究这个东西了,偶还要集中精力研究平面三维和程序。 下面的文章部分引自雨浪,Tingpu,lyz0508等一些网友的发表的技术,特此感谢。如有技术上的错误,也许偶也没有研究到,请跟帖斧正。 Nlite精简后期处理总结: Nlite使用当然不想多说了,网上教程很多,自己挑自己需要的Windows组件吧。唯一想说的是:在勾选去除组件时,多看看组件说明,如移除Outlook,将会失去什么功能? 一、Nlite完成后,将I386文件夹中Win9xmig、Win9xupg、Drw目录删除掉,可以节约大量的空间。 二、实现Windows,Dos,光盘安装三种安装方式 要使你的XP能在Windows下安装,也就是调用Winnt32.exe不出错,需要保留Compdata目录下的Drvmain.inf,和Ntcompat.inf两个文件,以及Winntupg目录下的Netmap.inf和Netupgrd.dll两个文件即可,这个方法大概是Deepin找到的,或许是某个老外的方法也不一定。当然前题是精简时不能移除DOS安装。这样你的Windows XP也可以实现Windows,Dos,光盘安装三种安装方式。另外更激进点的作法是把这三个INF里除了小节名,键值全删光的作法,又节省了一点空间。 三、进一步压缩i386目录下的部分文件,如下表: ntprint.catntprint.infregedit.exedbghelp.dllexts.dllimagehlp.dlldbgeng.dllintl.inf   (这个文件居然也可以压缩,而且都不用修改Txtsetup,真是太好了!) 提示:用Cabarc.exe(XP光盘support\tools目录下的Support.cab中)以21最大压缩可以得到最好的效果,偶认为可以集成进自己的XP中,因为一般大家精简时都删除了Support目录的,这个是MS的免费DD,怎能不要?有时间,偶会写个它的外壳程序,方便大家调用。另题外话一下,一直没有发现这个工具,以前一直以为是Winrar压缩率最高,结果有时候发现CAB居然比Winrar还厉害,该不是MS的秘密超强压缩算法吧? 给一个命令行格式吧:cabarc -m LZX:21 n %1 %2 存为cab.bat调用示例:压缩上面表中第一个文件,当然,其它文件也可以如此压缩cab ntprint.ca_ x:\winxp\i386\ntprint.cat     x:为你光盘的位置 下面两个文件用Upx进行压缩 winnt32u.dllwinntbbu.dll 不要忘了把未压缩的文件删除掉,又节约了好多的空间呀!^_^ 四、处理输入法(以保留了全拼,智能ABC为例)前题是在Nlite移除框中删除了输入法相关文件。 打开Hivesys.inf,查找Addreg,直到定位到最后一个,用分号注释掉或是删掉如下行:;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0020804″,”Layout File”,0x00000000,”kbdus.dll”;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0020804″,”Layout Text”,0x00000000,”%KLT_74%”;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0020804″,”IME File”,0x00000000,”winsp.ime” ;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0030804″,”Layout File”,0x00000000,”kbdus.dll”;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0030804″,”Layout Text”,0x00000000,”%KLT_75%”;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0030804″,”IME File”,0x00000000,”winzm.ime” ;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E00E0804″,”Layout File”,0x00000000,”kbdus.dll”;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E00E0804″,”Layout Text”,0x00000000,”%KLT_91%”;HKLM,”SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E00E0804″,”IME File”,0x00000000,”pintlgnt.ime” 规律为每三行代表一个输入法,第一个三行是双拼,第二个三行是郑码,第三个三行是微软拼音,也就是在原输入法设置中点添加时看到的,注释掉后这里就不会出现了,现在只剩下内码和全拼 打开Hivedef.inf,查找Preload,这里将会看到几个,从字面上可以这么理解,就是预加载相应的输入法,也就是左点输入法看到的可以切换的输入法,这里我们将全拼设为不加载,将其置入添加输入法选项。用分号注释除下面两行外的PreloadHKCU,”Keyboard Layout\Preload”,”1″,0x00000002,”00000804″(美国中文键盘)HKCU,”Keyboard Layout\Preload”,”2″,0x00000002,”E0040804″(智能ABC)… Continue reading nLite(From Deepin)

在linux下如何判断cpu是双核还是单核

linux下可以在/proc/cpuinfo中看到每个cpu的详细信息。 但是对于双核的cpu,在cpuinfo中会看到两个cpu。 常常会让人误以为是两个单核的cpu。 其实应该通过Physical Processor ID来区分单核和双核。 而Physical Processor ID可以从cpuinfo或者dmesg中找到 例如 root@debian:~:0# dmesg | grep CPU | grep ID CPU0: Initial APIC ID: 0, Physical Processor ID: 0 CPU1: Initial APIC ID: 1, Physical Processor ID: 0 CPU2: Initial APIC ID: 6, Physical Processor ID: 3 CPU3: Initial APIC ID: 7, Physical Processor ID: 3 可以看到,这台机器有两个双核的CPU,ID分别是0和3

剖析Linux系统启动过程

内容提要   本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。   阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分的源码主要使用的是C语言,也涉及到了少量的汇编。而启动过程中也执行了大量的shell(主要是bash shell)所写脚本。为了方便读者阅读,笔者将整个Linux启动过程分成以下几个部分逐一介绍,大家可以参考下图:   当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。     下面就将逐一介绍其中几个关键的部分:   第一部分:内核的引导(核内引导)   Red Hat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。   其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0x100000。   那么0x100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?   0x100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过”arch/i386/boot/compressed/”中的head.S利用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。   当CPU跳到0x100000时,将执行”arch/i386/kernel/head.S”中的startup_32,它也是vmlinux的入口,然后就跳转到start_kernel()中去了。start_kernel()是”init/main.c”中的定义的函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。   在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安装。   当do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输入输出文件stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。到此init()函数结束,内核的引导部分也到此结束了,     第二部分:运行init   init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序,。init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。在Redhat系统中,inittab的内容如下所示(以“###”开始的中注释为笔者增加的):   #   # inittab       This file describes how the INIT process should set up   #               the system in a certain run-level.   #   # Author:       Miquel van Smoorenburg,   #               Modified for RHS Linux by Marc… Continue reading 剖析Linux系统启动过程

深入了解Linux的守护进程

                Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。守 护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。linux系统有很多守护进程,大多数服务器都是用守护进程实现的。同时,守护进程完成许多系统任务,比如,作业规划进程crond、打印进程lqd等。有些书籍和资料也把守护进程称作:“服务”。选择运行哪些守护进程,要根据具体需求决定。查看系统可以提供的守护进程对应的服务,使用下面方法,以root权限运行: #ntsysv 图1 可以选择的系统服务 界面如图1所示的窗口,下面详细介绍一下各项系统服务的功能。以英文字母为序: 一、Linux守护进程简介 1.alsasound :Alsa声卡驱动守护程序。Alsa声卡驱动程序本来是为了 一种声卡Gravis UltraSound(GUS)而写的,该程序被证 明很优秀,于是作者就开始为一般的声卡写 驱动程序。 Alsa和OSS/Free 及OSS/Linux兼容,但是有自己的接 口,甚至比OSS优秀。 2.acpid:acpid(Advanced Configuration and Power Interface)是为替代传统的APM电源管理标准而推出的新型电源管理标准。通常笔记本电脑需要启动电源进行管理。 3.atalk:AppleTalk网络守护进程。注意不要在后台运行该程序,该程序的数据结构必须在运行其他进程前先花一定时间初始化。 4.amd: 自动安装NFS守护进程。 5.anacron:一个自动化运行任务守护进程。Red Hat Linux 随带四个自动化任务的工具:cron、 anacron、at、和 batc。当你的Linux服务器并不是全天运行,这个anacron就可以帮你执行在”crontab”设定的时间内没有执行的工作。 6.apmd:apmd(Advanced Power Management)是高级电源管理。传统的电源管理标准,对于笔记本电脑比较有用,可以了解系统的电池电量信息。并将相关信息通过syslogd 写入日志。也可以用来在电源不足时关机。 7.arptables_jf :为arptables网络的用户控制过滤的守护进程。 8.arpwatch: 记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库 。 atd:at和batch命令守护进程,用户用at命令调度的任务。Batch用于在系统负荷比较低时 运行批处理任务。 9.autofs:自动安装管理进程automount,与NFS相关,依赖于NIS服务器。 10.bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息。 11.bluetooch:蓝牙服务器守护进程。 12.crond :cron是Unix下的一个传统程序,该程序周期地运行用户 调度的任务。比起传统的Unix版本,Linux版本添加了不少属性,而且更安全,配置更简单。类似计划任务。… Continue reading 深入了解Linux的守护进程

PSP神奇电池V3增强版制作教程071228更新(转)

PSP 神电V3增强版,推翻所有版本PSP,新P,老P,均可通过它进行软降和修砖。制作它也非常简单。(071228版更新) 一、神电V3,不过是通俗叫法,真正的名称应该是神奇电池+神奇记忆棒V3版,因为神奇电池只是起到引导PSP进入工程模式的钥匙,而真正起到降级、修砖等功能的程序还是在记忆棒上的,所有不断更新记忆棒上的程序,将获得更强大的功能。 为保证刷机过程中电不断,建议既插着电池,又插着电源进行降级和修砖操作。 神电V3增强版的制作一改之前复杂操作,同时也支持新、老PSP的各个版本,是目前不可或缺的PSP工具软件。只要你严格按照如下方式操作: 二、神电制作必备硬件工具: (1)完好的PSP一台,(新版、老版无所谓)但系统必须是自制系统,PSP完好的条件是(可以运行盗版iso游戏和自制软件); (2)PSP原装电池1块(新版、老版无所谓)(用来制作PSP神奇电池,一般是大家购买新电池后,淘汰下来的旧电池用来制作。); (3)sony记忆棒,是否原、组装,是否高、低速均无所谓,关键是型号和容量。(型号:必须是pro duo的,这个在记忆棒上面有标明;容量:256MB~4G之间)。一般大家都会考虑用数码相机上的旧的记忆棒来制作,或者淘汰原来1G组棒来制作神奇电池。 三、神电制作必备软件:下载站点(http://psp.ys168.com) (1)神奇电池制作程序:对应新老主机(sqdc.rar和sqdc3xx.rar); (2)神奇记忆棒初版制作程序:PC端上的操作(sqjyb.rar) (3)神奇记忆棒V3增强版制作程序:PC端上的操作(elf.rar) (4)PSP官方1.5升级程序、3.40升级程序、3.71升级程序。 四、教程: 1:制作神奇记忆棒V3增强版制作(其内容已包含初版制作程序)   制作神奇记忆棒对系统没有要求,只是电脑端的操作,建议使用记忆棒读卡器完成,因为速度快,但是PC上面的系统必须是XP/2000,如果你的PC是vista系统就免了。解开压缩包,把整个文件夹复制到硬盘任意分区的根目录 (1)在PSP主机上进行一次记忆棒的格式化。 (2)连接USB,执行MagicMemoryStick.exe程序,点第一步MSP格式记忆棒,完成程序会提示OK。 (3)跳出一个框,按确定,接着断开USB,等待几秒钟后再次连接USB(必须这么做)。 (4)执行第二步写入IPL,成功后有提示,然后退出该程序,这是从PC上看记忆棒上没有任何数据,其实是有的,呵呵 (5)下载官方1.50、3.40、3.71三个版本的官方升级程序,并重命名为150.pbp、340.pbp、371.pbp,放到记忆棒根目录下,其中150.pbp重命名为update.pbp后再复制一次,最后记忆棒根目录有4个pbp文件。 (6)解压缩elf.rar文件,里面是elf、kd、registry三个目录,统统复制到记忆棒根目录。 OK!神奇记忆棒V3增强版制作完毕。但是有可能一次不成功,所以需要重复几次,制作完成后与神奇电池配合测试是否成功。 如果您想还原成普通记忆棒,只要使用PSP系统自带的格式化程序,OK!还原成普通的记忆棒了 2:制作神奇电池   制作或者还原一个神奇电池需要一个可以运行自制程序的系统(没有就借机器来制作,借不到就买现成的神奇电池) 2-1老版PSP,系统为3.52M33-4以下,包括(3.03OE、3.40OEA、官方1.5、3.51M33、等等等等) (1)复制解压出来的%__SCE__Battery.Creator文件夹和__SCE__Battery.Creator复制到记忆棒根目录(官方1.5的放在PSP\game下,OE/M33自制系统的放在PSP\game150下) (2)退出断开usb,然后运行程序 如果想把普通电池制作成神奇电池的,按“X” 如果想把神奇电池还原成普通电池的,按“口”。 OK!神奇电池制作完毕 2-2新版psp或老版PSP使用3.71M33系统的 (1)解压缩包sqdc3xx.rar,是一个“pan3xx”文件夹,里面是kstuff.prx和EBOOT.PBP两个文件。 (2)把pan3xx文件夹复制到记忆棒PSP\GAME下面,然后运行它。 如果想把普通电池制作成神奇电池的,按“O” 如果想把神奇电池还原成普通电池的,按“口”。 OK!神奇电池制作完毕 3:制作完毕测试: 先放入神奇记忆棒V3增强版,再放入神奇电池,成功就会出现菜单,是多功能的哦, 如果不成功,比如记忆棒没做成功,但是电池成功了,那么请取出电池,直接插电源开机,然后根据以上操作再次重复一次,直至成功。 菜单是多重菜单,但是普通玩家最多使用的还是神电V3版功能,就是菜单上“cementerio V3”,进入后是V3版子菜单,按”X”可直接将官方系统刷成3.71-M33-2,相当于软降或修砖,记得刷完机后别忘进入恢复模式进行F1格式化和优化设置下哦。 假如老版PSP出现V3黑屏,则需要修复key,详见相关教程 http://psphack.blog.163.com

正则表达式之道(转帖)

原著:Steve Mansour sman@scruznet.com Revised: June 5, 1999 (copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! ) 翻译:Neo Lee neo.lee@gmail.com 英文版原文 译者按:原文因为年代久远,文中很多链接早已过期(主要是关于vi、sed等工具的介绍和手册),本译文中已将此类链接删除,如需检查这些链接可以查看上面链接的原文。除此之外基本照原文直译,括号中有“译者按”的部分是译者补充的说明。如有内容方面的问题请直接和Steve Mansor联系,当然,如果你只写中文,也可以和我联系。 目 录 什么是正则表达式 范例    简单    中级(神奇的咒语)    困难(不可思议的象形文字) 不同工具中的正则表达式 不同工具中的正则表达式这一节,其中有一些在别的工具中使用正则表达式的例子。还有一个关于vi中文本替换命令(s)的简单说明附在文后供参考。 正则表达式基础 正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。 在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式”testing”中没有包含任何元字符,,它可以匹配”testing”和”123testing”等字符串,但是不能匹配”Testing”。 要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 元字符   描述 . 匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。  $ 匹配行结束符。例如正则表达式weasel$ 能够匹配字符串”He’s a weasel“的末尾,但是不能匹配字符串”They are a bunch… Continue reading 正则表达式之道(转帖)

正则表达式入门教程(转载)

正则表达式30分钟入门教程 版本:v2.21 (2007-8-3) 作者:deerchao 来源:unibetter大学生社区 目录 本文目标 如何使用本教程 正则表达式到底是什么? 入门 测试正则表达式 元字符 字符转义 重复 字符类 反义 替换 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 一些我认为你可能已经知道的术语的参考 网上的资源及本文参考文献 更新说明 本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门。当然,如果你是超人,那自然得另当别论。 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,以后你还需要多练习,多使用,才能熟练掌握正则表达式。 除了作为入门教程之外,本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说,这个目标还是完成得不错的——你看,我自己也没能把所有的东西记下来,不是吗? 文本格式约定:专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 用于在其中搜索的字符串 对正则表达式或其中一部分的说明清除格式 正则表达式到底是什么? 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。 正则表达式是用于进行文本匹配的工具,所以本文里多次提到了在字符串里搜索/查找,这种说法的意思是在给定的字符串中,寻找与给定的正则表达式相匹配的部分。有可能字符串里有不止一个部分满足给定的正则表达式,这时每一个这样的部分被称为一个匹配。匹配在本文里可能会有三种意思:一种是形容词性的,比如说一个字符串匹配一个表达式;一种是动词性的,比如说在字符串里匹配正则表达式;还有一种是名词性的,就是刚刚说到的“字符串中满足给定的正则表达式的一部分”。 入门 学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。下面给出了不少简单的例子,并对它们作了详细的说明。 假设你在一篇英文小说里查找hi,你可以使用正则表达式hi。 这是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种情况中的任意一种。 不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。 \b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格或标点符号或换行来分隔的,但是\b并不匹配这些单词分隔符中的任何一个,它只匹配一个位置。(如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w) 假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b。 这里,.是另一个元字符,匹配除了换行符以外的任意字符。*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复出现任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词。 如果同时使用其它的一些元字符,我们就能构造出功能更强大的正则表达式。比如下面这个例子: 0\d\d-\d\d\d\d\d\d\d\d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码。当然,这个例子只能匹配区号为3位的情形)。 这里的\d是一个新的元字符,匹配任意的数字(0,或1,或2,或……)。-不是元字符,只匹配它本身——连字号。 为了避免那么多烦人的重复,我们也可以这样写这个表达式:0\d{2}-\d{8}。 这里\d后面的{2}({8})的意思是前面\d必须连续重复匹配2次(8次)。 测试正则表达式… Continue reading 正则表达式入门教程(转载)