转:创业者的10大谎言
2007/02/11 11:19 ArthurXF
(译者:Guy Kawasaki 是湾区著名的风险投资家。他在高科技创业方面的演讲、评论、文章总是充满了激情、睿智和幽默。他的“风险投资的10大谎言”更准确地说应该是风险投资拒绝给你投资时的10大借口。我个人认为该文对创业者的借鉴价值在于跟VC谈时不要期望值过高。而这篇“创业者的10大谎言”,几乎读每一条感觉都是在说自己。名为“谎言”其实是说创业者思考得不充分的关键问题。如果对每一个问题都有了令人信服的回答,也许离创业成功就不远了。因此选择这篇和大家分享。先打个预防针,Kawasaki的文风比较“损”。被他说中了,别往心里去,其实挺逗的。)
每年都会有几十个创业者来找我谈投资。每个人至少都要用到下述谎言中的3、4个。我把这些谎言列出来,不知是会让创业者们变得更诚实,还是会让他们编出新的谎言来。嗨,至少新的谎言也算有点创意吧。
1、我们的预测是保守的估计。创业者的估计从来都不是保守的。要是保守的话,那应该是0美元。我从来没有看到一个创业者达到她保守的估计。通常创业者根本不知道她的销售额会是多少。所以她就这么猜:“我说少了吧,投资者不会感兴趣;我说多了吧,他们会觉得我神经不正常。”结果就是,每个人的预测都是到第4年的时候销售额5千万美元。所以我总是把创业者给我的预期时间加一年,销售额乘0.1。
2、(某著名市场研究公司)称我们的市场总额到2010年会达到500亿美元。不管他是开发bar mitzah(译者:一种犹太教的成人仪式)计划软件还是802.11芯片组,每个创业者的PowerPoint里都有几页声称他们的市场总额会有百亿美元。风险投资者从来不相信这些预测,因为今天他已经听过5个这样的预测了。创业者们最好把这些预测从他们的PowerPoint里去掉。
3、(某大公司)下周就要和我们签购货合同了。创业者不知从哪个讲座上听说“公司已经有销售很重要”,就编出这条来。搞笑的是,到了下周,下下周,合同还是没签。然后就是各种借口:该公司的决策者被解聘了, CEO被炒鱿鱼了,发生自然灾害了,等等。投资者不会因为这个谎言投资的,除非销售已经真的发生。
4、我们只要拿到投资,某重量级的人士就会加入我们公司。往往,当VC给这个重量级的微软、甲骨文、升阳的副总打电话证实,回答如下:“谁告诉你的?对,我是在丘吉尔俱乐部(译者:著名的有关创业的非营利组织)跟他聊过几句。但我绝对没说过我会放弃我在Adobe的25万年薪加入他的公司。” 重量级人士是有可能加入小公司,但请让他们亲自给VC打电话来确证这一点。
5、没人在尝试我们正在做的事。这是最扯淡的一个谎言,因为从这条得出的结论无外乎两点:1、因为根本没有市场,所以没有别人做;2、你实在太不入流了,连用Google查找竞争对手都不会。不用说,以上哪个结论都不会有助于你拿到投资。通常,如果你有一个好主意,那你会有5个竞争对手。如果你有一个非常好的主意,那你会有15个竞争对手。
6、没人能做到我们做到的事。盲目狂妄自大,这比上一条还糟糕。第一个公司开始做一件事后90天内,就会有10家公司雨后春笋般做同样的事。Roger Bannister之前没人能在4分钟内跑完1英里。但在Roger Bannister创造该纪录后1个月内John Landy就又破了纪录。世界之大,能人之多,创业者认为他能在知识上取得垄断只能是自欺欺人。就像我对我热爱的 Macintosh那么有把握(译者:作者原来是苹果公司的高管和苹果产品的忠实拥护者),我确信当你对VC这样说时,VC已经听说另一个公司在做同样的事了。
7、赶快,别的VC也对我们感兴趣了。好消息是:没错,有不少公司真的是同时被多家VC看中。但坏消息是,那个公司多半不是你,因为你还有闲工夫读我的博客。就像我妈常说的“别用乌兹冲锋枪玩俄罗斯轮盘赌”。(译者:Kawasaki大妈啥意思?别找死?)是的,那些绝对牛的公司,投资者之间是有竞争的,创业者可以用这种方式逼着VC赶快做决策。但对于绝大多数创业者,你不是稀缺资源,这招不灵。参看前文“风险投资的10大谎言”,要知道很多情况下VC说也许会投资,其实是不会投资。
8、甲骨文又大、又蠢、又慢,根本不是威胁。 Larry Ellison(甲骨文公司的CEO)有他自己的私人飞机,他能让圣何塞机场夜间为他的专机开放,他的帆船大得连金门桥都快过不去了。而我们的创业者呢?他们从奥克兰机场坐最便宜的西南航空公司的飞机,有机会还要顺两包免费花生米。Larry Ellison和创业者的差距是有原因的。而那个原因不是甲骨文又大、又蠢、又慢。和甲骨文、微软等大公司竞争不是件容易的事。给这么说的创业者最好的评价也就是“天真”。也许你觉得自己很有胆量,但VC觉得那是愚蠢。
9、我们的管理团队有可证实的成功经历。谁说你可证实来着?公司的创始人曾经在摩根斯坦利做过一个夏天的实习生?在麦肯锡干过2年?曾经告诉John Sculley(译者:百事可乐和苹果的前CEO,导致了苹果的一系列产品失败和衰退)Macintosh如何开机关机?在VC眼里,真正的可证实是那些曾经成功的为投资者产生亿万汇报的创业者。但这样的创业者,a)她多半不会为找投资而发愁;b)她也用不着说她有可证实的经历。(Wayne Gretzky用不着到处对别人说我是个出色的冰球选手。)创业者应该这样自我介绍:a)她有相关的业界经验;b)她为了成功会付出一切努力;c)她会寻找真正有可证实的成功经历的人做她的顾问和董事会成员d)如有必要她会让贤。这对于对创业者有兴趣的VC来说就够好了。
10、我们的产品受专利保护。在你给VC介绍你的项目时,最多提到专利一次:我们申请了专利。这就够了。第二次你再提到专利,VC会怀疑你对专利过度依赖。第三次,VC就会把你当傻瓜了。没错,你应该去申请专利。但专利更多是用来让你爸妈高兴的。你多半不会有时间或有钱去告那些财大气粗的公司侵犯你的专利权。
11、我们只要占有1%的市场就成功了。(这一条是额外的添头儿,因为我的笔记本还有电。)这是“我们的市场总额有500亿美元”的另一面。这个谎言有两个问题:第一,没有哪个VC会对只想占有1%市场份额的公司感兴趣。我们更愿意看到我们投资的公司面对司法部反垄断部门的狂轰滥炸。第二,占有1%的市场也没那么容易。创业者应该对建立一个成功公司的难度有一个现实和准确地判断。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。
PHP培训招生简章
每年都会有几十个创业者来找我谈投资。每个人至少都要用到下述谎言中的3、4个。我把这些谎言列出来,不知是会让创业者们变得更诚实,还是会让他们编出新的谎言来。嗨,至少新的谎言也算有点创意吧。
1、我们的预测是保守的估计。创业者的估计从来都不是保守的。要是保守的话,那应该是0美元。我从来没有看到一个创业者达到她保守的估计。通常创业者根本不知道她的销售额会是多少。所以她就这么猜:“我说少了吧,投资者不会感兴趣;我说多了吧,他们会觉得我神经不正常。”结果就是,每个人的预测都是到第4年的时候销售额5千万美元。所以我总是把创业者给我的预期时间加一年,销售额乘0.1。
2、(某著名市场研究公司)称我们的市场总额到2010年会达到500亿美元。不管他是开发bar mitzah(译者:一种犹太教的成人仪式)计划软件还是802.11芯片组,每个创业者的PowerPoint里都有几页声称他们的市场总额会有百亿美元。风险投资者从来不相信这些预测,因为今天他已经听过5个这样的预测了。创业者们最好把这些预测从他们的PowerPoint里去掉。
3、(某大公司)下周就要和我们签购货合同了。创业者不知从哪个讲座上听说“公司已经有销售很重要”,就编出这条来。搞笑的是,到了下周,下下周,合同还是没签。然后就是各种借口:该公司的决策者被解聘了, CEO被炒鱿鱼了,发生自然灾害了,等等。投资者不会因为这个谎言投资的,除非销售已经真的发生。
4、我们只要拿到投资,某重量级的人士就会加入我们公司。往往,当VC给这个重量级的微软、甲骨文、升阳的副总打电话证实,回答如下:“谁告诉你的?对,我是在丘吉尔俱乐部(译者:著名的有关创业的非营利组织)跟他聊过几句。但我绝对没说过我会放弃我在Adobe的25万年薪加入他的公司。” 重量级人士是有可能加入小公司,但请让他们亲自给VC打电话来确证这一点。
5、没人在尝试我们正在做的事。这是最扯淡的一个谎言,因为从这条得出的结论无外乎两点:1、因为根本没有市场,所以没有别人做;2、你实在太不入流了,连用Google查找竞争对手都不会。不用说,以上哪个结论都不会有助于你拿到投资。通常,如果你有一个好主意,那你会有5个竞争对手。如果你有一个非常好的主意,那你会有15个竞争对手。
6、没人能做到我们做到的事。盲目狂妄自大,这比上一条还糟糕。第一个公司开始做一件事后90天内,就会有10家公司雨后春笋般做同样的事。Roger Bannister之前没人能在4分钟内跑完1英里。但在Roger Bannister创造该纪录后1个月内John Landy就又破了纪录。世界之大,能人之多,创业者认为他能在知识上取得垄断只能是自欺欺人。就像我对我热爱的 Macintosh那么有把握(译者:作者原来是苹果公司的高管和苹果产品的忠实拥护者),我确信当你对VC这样说时,VC已经听说另一个公司在做同样的事了。
7、赶快,别的VC也对我们感兴趣了。好消息是:没错,有不少公司真的是同时被多家VC看中。但坏消息是,那个公司多半不是你,因为你还有闲工夫读我的博客。就像我妈常说的“别用乌兹冲锋枪玩俄罗斯轮盘赌”。(译者:Kawasaki大妈啥意思?别找死?)是的,那些绝对牛的公司,投资者之间是有竞争的,创业者可以用这种方式逼着VC赶快做决策。但对于绝大多数创业者,你不是稀缺资源,这招不灵。参看前文“风险投资的10大谎言”,要知道很多情况下VC说也许会投资,其实是不会投资。
8、甲骨文又大、又蠢、又慢,根本不是威胁。 Larry Ellison(甲骨文公司的CEO)有他自己的私人飞机,他能让圣何塞机场夜间为他的专机开放,他的帆船大得连金门桥都快过不去了。而我们的创业者呢?他们从奥克兰机场坐最便宜的西南航空公司的飞机,有机会还要顺两包免费花生米。Larry Ellison和创业者的差距是有原因的。而那个原因不是甲骨文又大、又蠢、又慢。和甲骨文、微软等大公司竞争不是件容易的事。给这么说的创业者最好的评价也就是“天真”。也许你觉得自己很有胆量,但VC觉得那是愚蠢。
9、我们的管理团队有可证实的成功经历。谁说你可证实来着?公司的创始人曾经在摩根斯坦利做过一个夏天的实习生?在麦肯锡干过2年?曾经告诉John Sculley(译者:百事可乐和苹果的前CEO,导致了苹果的一系列产品失败和衰退)Macintosh如何开机关机?在VC眼里,真正的可证实是那些曾经成功的为投资者产生亿万汇报的创业者。但这样的创业者,a)她多半不会为找投资而发愁;b)她也用不着说她有可证实的经历。(Wayne Gretzky用不着到处对别人说我是个出色的冰球选手。)创业者应该这样自我介绍:a)她有相关的业界经验;b)她为了成功会付出一切努力;c)她会寻找真正有可证实的成功经历的人做她的顾问和董事会成员d)如有必要她会让贤。这对于对创业者有兴趣的VC来说就够好了。
10、我们的产品受专利保护。在你给VC介绍你的项目时,最多提到专利一次:我们申请了专利。这就够了。第二次你再提到专利,VC会怀疑你对专利过度依赖。第三次,VC就会把你当傻瓜了。没错,你应该去申请专利。但专利更多是用来让你爸妈高兴的。你多半不会有时间或有钱去告那些财大气粗的公司侵犯你的专利权。
11、我们只要占有1%的市场就成功了。(这一条是额外的添头儿,因为我的笔记本还有电。)这是“我们的市场总额有500亿美元”的另一面。这个谎言有两个问题:第一,没有哪个VC会对只想占有1%市场份额的公司感兴趣。我们更愿意看到我们投资的公司面对司法部反垄断部门的狂轰滥炸。第二,占有1%的市场也没那么容易。创业者应该对建立一个成功公司的难度有一个现实和准确地判断。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。
PHP培训招生简章
跟着ArthurXF学FreeBSD21——清空FreeBSD系统日志
2007/02/09 23:05 ArthurXF
FreeBSD的日志文件很强大,可以分析排出很多的错误,但是这些日志不断地积累,会变得很大,占用了太多的磁盘空间,我们可能需要清空他们,释放磁盘空间。如果你使用rm命令,那么必须重起apache,日志文件才会重新建立。为了不影响系统的运转,请使用下面的命令来清空系统日志。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
引用
# cd /var/log/
# true > httpd-access.log
# true > httpd-access.log
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
跟着ArthurXF学FreeBSD20——用ports安装PDO
2007/02/09 16:06 ArthurXF
php连接数据库有很多的中间件,例如ADODB,这些中间件,可以让我们很方便连接各种不同类型的数据库,仅仅只需要换一下连接参数即可,这些中间件还有大量的缓存处理等强大功能,真可谓是我们开发者的福音啊,ADODB虽然好用,但是毕竟还是需要外部开发的,PDO已经被集成到了PHP5里,为了将来的扩展和升级,所以我们开发的时候还是尽量使用PDO,那么我们开始安装PDO吧。
安装了这个仅仅是安装好了PDO的驱动,这时候还是连接不到任何数据库的。还需要安装具体数据库的连接驱动。
先安装PDO_MYSQL
再安装PDO_PGSQL
如果需要PDO_SQLITE
其他的还有pecl-PDO_DBLIB,pecl-PDO_OCI,pecl-PDO_ODBC等,如果需要也可以按照上面的方法安装。
安装好了之后,重起apache,再看phpinfo,应该可以看到pdo的项目了,如果没有就去看一下
vi /usr/local/etc/php/extensions.ini
看看有没有下面这写,没有就自己加上去,重起apache即可。
extension=pdo.so
extension=pdo_pgsql.so
extension=pdo_mysql.so
extension=pdo_sqlite.so
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
引用
cd /usr/ports/databases/pecl-PDO
make install
make install
安装了这个仅仅是安装好了PDO的驱动,这时候还是连接不到任何数据库的。还需要安装具体数据库的连接驱动。
先安装PDO_MYSQL
引用
cd /usr/ports/databases/pecl-PDO_MYSQL
make install
随着版本变动,如果上面找不到相对应的port,那么就执行下面的命令
cd /usr/ports/databases/php5-pdo_mysql
make install
make install
随着版本变动,如果上面找不到相对应的port,那么就执行下面的命令
cd /usr/ports/databases/php5-pdo_mysql
make install
再安装PDO_PGSQL
引用
cd /usr/ports/databases/pecl-PDO_PGSQL
make install
随着版本变动,如果上面找不到相对应的port,那么就执行下面的命令
cd /usr/ports/databases/php5-pdo_pgsql
make install
make install
随着版本变动,如果上面找不到相对应的port,那么就执行下面的命令
cd /usr/ports/databases/php5-pdo_pgsql
make install
如果需要PDO_SQLITE
引用
cd /usr/ports/databases/pecl-PDO_SQLITE
make install
随着版本变动,如果上面找不到相对应的port,那么就执行下面的命令
cd /usr/ports/databases/php5-pdo_sqlite
make install
make install
随着版本变动,如果上面找不到相对应的port,那么就执行下面的命令
cd /usr/ports/databases/php5-pdo_sqlite
make install
其他的还有pecl-PDO_DBLIB,pecl-PDO_OCI,pecl-PDO_ODBC等,如果需要也可以按照上面的方法安装。
安装好了之后,重起apache,再看phpinfo,应该可以看到pdo的项目了,如果没有就去看一下
vi /usr/local/etc/php/extensions.ini
看看有没有下面这写,没有就自己加上去,重起apache即可。
extension=pdo.so
extension=pdo_pgsql.so
extension=pdo_mysql.so
extension=pdo_sqlite.so
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
跟着ArthurXF学FreeBSD19——用ports安装postgresql82
2007/02/09 15:36 ArthurXF
PostgreSQL是一款开源的大型数据库,有很多的大型数据库都是以它为前身发展过来的,PostgreSQL支持视图,触发器等等功能,那么就来安装最新版的PostgreSQL82吧。
安装postgresql82-server会自动安装postgresql82-client的,所以不需要我们另外单独安装client了。
安装PostgreSQL的管理工具phppgadmin
这是一个php写得管理PostgreSQL的工具,所以默认会安装到apache指定的web路径,一般为/usr/local/www,如果你指定其他的路径,或者想放到虚拟主机下,只需要cp phpPgAdmin整个目录到你想要防止的目录即可。
初始化PostgreSQL的数据库
默认数据库存放地址为/usr/local/pgsql/data,如果你不想把数据库放在这里就需要修改设置,例如:
su pgsql的意思是切换到用户pgsql,所以我们会看到状态符号变成了$,如果我们想返回root状态,直接使用exit命令即可。
下面这步很关键,要不然又要摸索很长时间了。
test为你设置的使用PostgreSQL数据库的用户名和密码,我们可以设置成为用户名和密码都是test。
在/etc/rc.conf加入
然后启动PostgreSQL
这里特别需要注意一下,因为PostgreSQL为了安全性,所以只能通过没有特权的帐号执行start,stop等命令,当然这些我们都不需要考虑,postgresql已经都设置好了,只是像我们以前说的,你配置的环境变量如果只是配置了root,那么很可能发生切换到pgsql帐号时,Permission denied.等错误,需要到 /usr/local/pgsql,编辑.cshrc,或者把环境变量加到整个系统的配置文件中去,这样的错误就会解决得。如果你还是搞不定,那么重起肯定能搞定了。呵呵。
啰嗦了半天,还没完,安装好了PostgreSQL,可是查看phpinfo的时候,竟然没发现PostgreSQL,说明PostgreSQL和php还没挂接上,执行下面的操作来挂接。
执行成功后,看phpinfo,看到pgsql项目了吧?现在已经安装好了,php也可以连接和使用PostgreSQL了,我们用phppgadmin来看看
执行phppgadmin后,点击左边那个带禁止符号的PostgreSQL,右边出现了登录框,如果你没用createuser -s -P test建立用户,那么这时输入什么都登录不了,包括pgsql,这时输入我们刚建立的test和密码test,看看成功进入了吧。呵呵,管理PostgreSQL还真有点困难啊。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
引用
cd /usr/ports/databases/postgresql82-server/
make
make install clean
make
make install clean
安装postgresql82-server会自动安装postgresql82-client的,所以不需要我们另外单独安装client了。
安装PostgreSQL的管理工具phppgadmin
引用
cd /usr/ports/databases/phppgadmin
make install clean
make install clean
这是一个php写得管理PostgreSQL的工具,所以默认会安装到apache指定的web路径,一般为/usr/local/www,如果你指定其他的路径,或者想放到虚拟主机下,只需要cp phpPgAdmin整个目录到你想要防止的目录即可。
初始化PostgreSQL的数据库
引用
su pgsql
initdb -D /usr/local/pgsql/data
initdb -D /usr/local/pgsql/data
默认数据库存放地址为/usr/local/pgsql/data,如果你不想把数据库放在这里就需要修改设置,例如:
引用
mkdir /var/pgsql/data
chown pgsql /var/pgsql/data
#su pgsql
$initdb -D /var/pgsql/data
chown pgsql /var/pgsql/data
#su pgsql
$initdb -D /var/pgsql/data
su pgsql的意思是切换到用户pgsql,所以我们会看到状态符号变成了$,如果我们想返回root状态,直接使用exit命令即可。
下面这步很关键,要不然又要摸索很长时间了。
引用
$createuser -s -P test
test为你设置的使用PostgreSQL数据库的用户名和密码,我们可以设置成为用户名和密码都是test。
在/etc/rc.conf加入
引用
#vi /etc/rc.conf
postgresql_enable="YES"
postgresql_enable="YES"
然后启动PostgreSQL
引用
#postgresql start
这里特别需要注意一下,因为PostgreSQL为了安全性,所以只能通过没有特权的帐号执行start,stop等命令,当然这些我们都不需要考虑,postgresql已经都设置好了,只是像我们以前说的,你配置的环境变量如果只是配置了root,那么很可能发生切换到pgsql帐号时,Permission denied.等错误,需要到 /usr/local/pgsql,编辑.cshrc,或者把环境变量加到整个系统的配置文件中去,这样的错误就会解决得。如果你还是搞不定,那么重起肯定能搞定了。呵呵。
啰嗦了半天,还没完,安装好了PostgreSQL,可是查看phpinfo的时候,竟然没发现PostgreSQL,说明PostgreSQL和php还没挂接上,执行下面的操作来挂接。
引用
#cd /usr/ports/databases/php5-pgsql
#make
#make install clean
#make
#make install clean
执行成功后,看phpinfo,看到pgsql项目了吧?现在已经安装好了,php也可以连接和使用PostgreSQL了,我们用phppgadmin来看看
执行phppgadmin后,点击左边那个带禁止符号的PostgreSQL,右边出现了登录框,如果你没用createuser -s -P test建立用户,那么这时输入什么都登录不了,包括pgsql,这时输入我们刚建立的test和密码test,看看成功进入了吧。呵呵,管理PostgreSQL还真有点困难啊。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
PHP正则表达式语法和常用例子
2007/02/08 13:21 ArthurXF
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
--------------------------------------------------------------------------------
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^
匹配输入字符串的开始位置。
$
匹配输入字符串的结束位置。
*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
.
匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern)
匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)
负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz]
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d
匹配一个数字字符。等价于 [0-9]。
\D
匹配一个非数字字符。等价于 [^0-9]。
\f
匹配一个换页符。等价于 \x0c 和 \cL。
\n
匹配一个换行符。等价于 \x0a 和 \cJ。
\r
匹配一个回车符。等价于 \x0d 和 \cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于 \x09 和 \cI。
\v
匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
常用例子:
=>(.*)>(.*)>\/\1>
--------------------------------------------------------------------------------
引用
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^
匹配输入字符串的开始位置。
$
匹配输入字符串的结束位置。
*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
.
匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern)
匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)
负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz]
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d
匹配一个数字字符。等价于 [0-9]。
\D
匹配一个非数字字符。等价于 [^0-9]。
\f
匹配一个换页符。等价于 \x0c 和 \cL。
\n
匹配一个换行符。等价于 \x0a 和 \cJ。
\r
匹配一个回车符。等价于 \x0d 和 \cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于 \x09 和 \cI。
\v
匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
常用例子:
引用
配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{ 4,15 }$
匹配国内电话号码:(\d{ 3 }-|\d{ 4 }-)?(\d{ 8 }|\d{ 7 })?
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{ 4,15 }$
匹配国内电话号码:(\d{ 3 }-|\d{ 4 }-)?(\d{ 8 }|\d{ 7 })?
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$
=>(.*)>(.*)>\/\1>