| 彦松's profile七彩网络PhotosBlogLists | Help |
|
July 27 Google的妙用来自:黑白网络
google hacking其实并算不上什么新东西,当时并没有重视这种技术,认为webshell什么的,并无太大实际用途.google hacking其实并非 如此简单... google hacking的简单实现 使用google中的一些语法可以提供给我们更多的信息(当然也提供给那些习惯攻击的人更多他们所想要的.),下面就来介绍一些常用的语法. intext: 这个就是把网页中的正文内容中的某个字符做为搜索条件.例如在google里输入:intext:动网.将返回所有在网页正文部分包含"动网"的网页 .allintext:使用方法和intext类似. intitle: 和上面那个intext差不多,搜索网页标题中是否有我们所要找的字符.例如搜索:intitle:安全天使.将返回所有网页标题中包含"安全天使"的网 页.同理allintitle:也同intitle类似. cache: 搜索google里关于某些内容的缓存,有时候也许能找到一些好东西哦. define: 搜索某个词语的定义,搜索:define:hacker,将返回关于hacker的定义. filetype: 这个我要重点推荐一下,无论是撒网式攻击还是我们后面要说的对特定目标进行信息收集都需要用到这个.搜索指定类型的文件.例如输入 :filetype:doc.将返回所有以doc结尾的文件URL.当然如果你找.bak、.mdb或.inc也是可以的,获得的信息也许会更丰富 info: 查找指定站点的一些基本信息. inurl: 搜索我们指定的字符是否存在于URL中.例如输入:inurl:admin,将返回N个类似于这样的连接:http://www.xxx.com/xxx/admin,用来找管理员登 陆的URL不错.allinurl也同inurl类似,可指定多个字符. link: 例如搜索:inurl:www.4ngel.net可以返回所有和www.4ngel.net做了链接的URL. site: 这个也很有用,例如:site:www.4ngel.net.将返回所有和4ngel.net这个站有关的URL. 对了还有一些*作符也是很有用的: + 把google可能忽略的字列如查询范围 - 把某个字忽略 ~ 同意词 . 单一的通配符 * 通配符,可代表多个字母 "" 精确查询 下面开始说说实际应用 以下内容均在google上搜索,对于一个居心叵测的攻击者来说,可能他最感兴趣的就是密码文件了.而google正因为其强大的搜索能力往往会 把一些敏感信息透露给他们.用google搜索以下内容: intitle:"index of" etc intitle:"Index of" .sh_history intitle:"Index of" .bash_history intitle:"index of" passwd intitle:"index of" people.lst intitle:"index of" pwd.db intitle:"index of" etc/shadow intitle:"index of" spwd intitle:"index of" master.passwd intitle:"index of" htpasswd "# -FrontPage-" inurl:service.pwd 有时候因为各种各样的原因一些重要的密码文件被毫无保护的暴露在网络上,如果被别有用心的人获得,那么危害是很大的 同样可以用google来搜索一些具有漏洞的程序,例如ZeroBoard前段时间发现个文件代码泄露漏洞,可以用google来找网上使用这套程序的站 点: intext:ZeroBoard filetype:php 或者使用: inurlutlogin.php?_zb_path= site:.jp 来寻找我们所需要的页面.phpmyadmin是一套功能强大的数据库*作软件,一些站点由于配置失误,导致我们可以不使用密码直接对phpmyadmin进 行*作.我们可以用google搜索存在这样漏洞的程序URL: intitle:phpmyadmin intext:Create new database 还记http://www.xxx.com/_vti_bin/..%5 ... ystem32/cmd.exe?dir吗?用google找找,你也许还可以找到很多 古董级的机器。同样我们可以用这个找找有其他cgi漏洞的页面。 allinurl:winnt system32 前面已经简单的说过可以用google来搜索数据库文件,用上一些语法来精确查找能够获得更多东西(access的数据库,mssql、mysql的连接文件 等等).举个例子示例一下: allinurl:bbs data filetype:mdb inurl:database filetype:inc conn inurl:data filetype:mdb intitle:"index of" data //在一些配置不正确的apache+win32的服务器上经常出现这种情况,和上面的原理一样,我们还可以用google来找后 台. 利用google完全是可以对一个站点进行信息收集和渗透的,下面我们用google对特定站点进行一次测试。 首先用google先看这个站点的一些基本情况(一些细节部分就略去了): site:xxxx.com 从返回的信息中,找到几个该校的几个系院的域名: http://a1.xxxx.com http://a2.xxxx.com http://a3.xxxx.com http://a4.xxxx.com 顺便ping了一下,应该是在不同的服务器.学校一般都会有不少好的资料,先看看有什么好东西没 site:xxxx.com filetype:doc 得到N个不错的doc。 先找找网站的管理后台地址: site:xxxx.com intext:管理 site:xxxx.com inurl:login site:xxxx.com intitle:管理 超过获得2个管理后台地址: http://a2.xxxx.com/sys/admin_login.asp http://a3.xxxx.com:88/_admin/login_in.asp 还算不错,看看服务器上跑的是什么程序: site:a2.xxxx.com filetype:asp site:a2.xxxx.com filetype:php site:a2.xxxx.com filetype:aspx site:a3.xxxx.com filetype:asp site:....... ...... a2服务器用的应该是IIS,上面用的是asp的整站程序,还有一个php的论坛 a3服务器也是IIS,aspx+asp。web程序都应该是自己开发的。有论坛那就看看能不能遇见什么公共的FTP帐号什么的: site:a2.xxxx.com intext:ftp://*:* 没找到什么有价值的东西。再看看有没有上传一类的漏洞: site:a2.xxxx.com inurl:file site:a3.xxxx.com inurl:load 在a2上发现一个上传文件的页面: http://a2.xxxx.com/sys/uploadfile.asp 用IE看了一下,没权限访问。试试注射, site:a2.xxxx.com filetype:asp 得到N个asp页面的地址,体力活就让软件做吧,这套程序明显没有对注射做什么防范,dbowner权限,虽然不高但已足矣,back a shell不太喜 欢,而且看起来数据库的个头就不小,直接把web管理员的密码暴出来再说,MD5加密过。一般学校的站点的密码都比较有规律,通常都是域名+ 电话一类的变形,用google搞定吧。 site:xxxx.com //得到N个二级域名 site:xxxx.com intext:*@xxxx.com //得到N个邮件地址,还有邮箱的主人的名字什么的 site:xxxx.com intext:电话 //N个电话 把什么的信息做个字典吧,挂上慢慢跑。过了一段时间就跑出4个帐号,2个是学生会的,1个管理员,还有一个可能是老师的帐号。登陆上去: name:网站管理员 pass:a2xxxx7619 //说了吧,就是域名+4个数字 要再怎么提权那就不属于本文讨论访问了,呵呵,到此为止。 这段时间在国外的一些google hack的研究站点看了看,其实也都差不多是一些基本语法的灵活运用,或者配合某个脚本漏洞,主要还是靠 个人的灵活思维。国外对于google hack方面的防范也并不是很多,所以大家还是点到为止,不要去搞破坏拉,呵呵。对于一些在win上跑 apache的网管们应该多注意一下这方面,一个intitle:index of就差不多都出来了 1.查找利用php webshell intitle:"php shell*" "Enable stderr" filetype:php (注: intitle—网页标题 Enable stderr—UNIX标准输出和标准错误的缩写filetype—文件类型)。搜索结果中,你能找到很多直接在机器上执 行命令的web shell来。如果找到的PHPSHELL不会利用,如果你不熟悉UNIX,可以直接看看LIST,这里就不详细说了,有很多利用价值。要说明 的是,我们这里搜索出来的一些国外的PHPSHELL上都要使用UNIX命令,都是system调用出来的函数(其实用百度及其他搜索引擎都可以,只是填 写搜索的内容不同)。这个PHPWEBSHELL是可以直接Echo(Unix常用命令)。一句话就把首页搞定了: echo "召唤" > index.jsp 现在看看首页,已经被我们改成: "召唤" 了。 我们也可以用WGET上传一个文件上去(比如你要替换的叶子吧)。然后execute Command输入 cat file > index.html or echo "" > file echo "test" >> file 这样一条条打出来,站点首页就成功被替换了。同样的也可以 uname -a;cat /etc/passwd 不过有点要注意,有些WEBSHELL程序有问题,执行不了的, 2.搜索INC敏感信息 在google的搜索框中填入: Code: .org filetype:inc July 22 网页中一些屏蔽用法1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu=return(false)><td>no</table> 可用于Table 2. <body onselectstart="return false"> 取消选取、防止复制 3. onpaste="return false" 不准粘贴 4. oncopy="return false;" oncut="return false;" 防止复制 5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标 6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标 7. <input style="ime-mode:disabled"> 关闭输入法 8. 永远都会带着框架 9. 防止被人frame 10. <noscript><iframe src=*.html></iframe></noscript> 网页将不能被另存为
12. 怎样通过asp的手段来检查来访者是否用了代理 犹如 if Request.ServerVariables("HTTP_X_FORWARDED_FOR")=“” then IP=Request.ServerVariables("REMOTE_ADDR") 13. 取得控件的绝对位置 //javascript //VBScript 14. 光标是停在文本框文字的最后 15. 判断上一页的来源 javascript: 16. 最小化、最大化、关闭窗口 <input type=button value=最小化 onclick=hh1.Click()> 17. Const adLockReadOnly = 1 '锁定类型,默认的,只读,不能作任何修改 Const adCmdText = &H0001 18. 网页不会被缓存
20. 获得一个窗口的大小 21. 怎么判断是否是字符 22.TEXTAREA自适应文字行数的多少 July 07 现实的生活来深圳一个月了,天天跑人才市场,然后几乎天天面试。无心插柳,上周去了一家公司(本来不怎么想去的,因为第一次和老板谈的时候就感觉很郁闷,不太懂技术的人,还老摆一副牛人的样子,超BS),本来是应聘的网站后台,结果去了是让我搜集资料,500多个小类,我晕,把我当文秘用了,结果呆了一个小时回来了。继续跑人才市场...
天意弄人,前天在人才市场把手机丢了,确切的说是被人“拿”走了,一个破手机倒无所谓了,可惜的是我投的那些公司都无法和我联系,丢东西也是对人的一大打击,虽然手机不怎么好,而且是在这么失意的时候。无奈...
现在人才市场的人是明显增多了,05年的毕业生都跑深圳来了吧,跑多了,经常在那里碰到一些熟面孔,他们也和我一样还没找到工作,心里稍微平衡了一点。怎么说呢,深圳的机会是多一些,但是现在有点供过于求了,公司一个职位收了6、7十甚至上百份简历慢慢挑,狂晕。而且现在才发觉深圳这边的要求都蛮高的,以前自己做一些东西还觉得蛮轻松的,挺自信,到了深圳这边公司要求的更多,现在才发觉以前用的那些东西只是皮毛罢了,要学的东西实在太多了。
今天又去了一家公司,做“健身游戏”的,蛮新颖的吧,国内据说就他一家,听老板的介绍后感觉蛮不错的,我负责网站和客户的技术支持,虽然工作会有点累,但我比较感兴趣,后天再去和他们搞技术的谈一下,希望能到这个公司吧,工资也蛮不错的。而且他们老板是复旦研究生,在华为呆了5年混到了经理,现在单干了,我能去的话应该能学不少东西,多接触一下市场也好,对自己有好处。祈祷吧,现在也多看些相关的技术文档了....
这一个多呆在大学同学那,还真是感谢他,老二... 正则表达式以前在客户端处理一些验证的case都是写些JS,今天忽然看到了一段用正则表达式来验证的代码,还蛮简便的,虽然以前也见过,不过没有仔细研究过,今天好好看了看,把它写在blog上得了,呵呵,站在前辈的肩膀上嘛,^_^
如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。
请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:
data1.dat
data2.dat
datax.dat
dataN.dat
如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:
data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。
使用正则表达式
在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。
使用正则表达式,就可以:
1.测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
2.替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
3.根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。
另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。VBScript 是 Visual Basic 的一个子集,具有丰富的字符串处理功能。与 C 类似的 Visual Basic Scripting Edition 则没有这一能力。正则表达式给 Visual Basic Scripting Edition 的字符串处理能力带来了明显改善。不过,可能还是在 VBScript 中使用正则表达式的效率更高,它允许在单个表达式中执行多个字符串操作。
正则表达式语法
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
这里有一些可能会遇到的正则表达式示例:
Visual Basic VBScript 匹配
Scripting Edition /^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。
/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID号码是否由一个2位字,一个连字符以及一个5位数字组成。
/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。
下表是元字符及其在正则表达式上下文中的行为的一个完整列表: 字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n'
匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,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",但不能匹配"Windows3 .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 匹配版权符号 (?)。
建立正则表达式
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。
可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对 Visual Basic Scripting Edition 而言,分隔符为一对正斜杠 (/) 字符。例如:
/expression/
对 VBScript 而言,则采用一对引号 ("") 来确定正则表达式的边界。例如:
"expression"
在上面所示的两个示例中,正则表达式模式 (expression) 均存储在RegExp 对象的Pattern 属性中。
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
优先权顺序
在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先权顺序来求值。
下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序:
操作符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作
普通字符
普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
最简单的正则表达式是一个单独的普通字符,可以匹配所搜索字符串中的该字符本身。例如,单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例:
/a/
/7/ /M/ 等价的 VBScript 单字符正则表达式为:
"a"
"7" "M" 可以将多个单字符组合在一起得到一个较大的表达式。例如,下面的 Visual Basic Scripting Edition 正则表达式不是别的,就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。
/a7M/
等价的 VBScript 表达式为:
"a7M"
请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。
特殊字符 有不少元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符,必须首先将这些字符转义,也就是在前面使用一个反斜杠 (\)。下表给出了这些特殊字符及其含义:
特殊字符 说明
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹
配 "\",而 '\(' 则匹配 "("。 ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
非打印字符
有不少很有用的非打印字符,偶尔必须使用。下表显示了用来表示这些非打印字符的转义序列:
字符 含义
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。
x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字 符。 \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。
字符匹配
句点 (.) 匹配一个字符串中任何单个的打印或非打印字符,除了换行符 (\n) 之外。下面的 Visual Basic Scripting Edition 正则表达式可以匹配 'aac'、'abc'、'acc'、'adc'如此等等,同样也可以匹配 'a1c'、'a2c'、a-c'以及 a#c':
/a.c/
等价的 VBScript 正则表达式为:
"a.c"
如果试图匹配一个包含文件名的字符串,其中句点 (.) 是输入字符串的一部分,则可以在正则表达式中的句点前面加上一个反斜杠 (\) 字符来实现这一要求。举例来说,下面的 Visual Basic Scripting Edition 正则表达式就能匹配 'filename.ext':
/filename\.ext/
对 VBScript 而言,等价的表达式如下所示:
"filename\.ext"
这些表达式仍然是相当有限的。它们只允许匹配任何单字符。很多情况下,对从列表中匹配特殊字符十分有用。例如,如果输入文字中包含用数字表示为Chapter 1, Chapter 2诸如此类的章节标题,你可能需要找到这些章节标题。
括号表达式 可以在一个方括号 ([ 和 ]) 中放入一个或多个单字符,来创建一个待匹配的列表。如果字符被放入括号中括起来,则该列表称为括号表达式。括号内和其他任何地方一样,普通字符代表其本身,也就是说,它们匹配输入文字中出现的一处自己。大多数特殊字符在位于括号表达式中时都将失去其含义。这里有一些例外:
1. ']' 字符如果不是第一项,则将结束一个列表。要在列表中匹配 ']' 字符,请将其放在第一项,紧跟在开始的 '[' 后面。
2. '\' 仍然作为转义符。要匹配 '\' 字符,请使用 '\\'。
括号表达式中所包含的字符只匹配该括号表达式在正则表达式中所处位置的一个单字符。下面的 Visual Basic Scripting Edition 正则表达式可以匹配 'Chapter 1'、'Chapter 2'、'Chapter 3'、'Chapter 4' 以及 'Chapter 5':
/Chapter ][12345]/
在 VBScript 中要匹配同样的章节标题,请使用下面的表达式:
"Chapter [12345]"
请注意单词 'Chapter' 及后面的空格与括号内的字符的位置关系是固定的。因此,括号表达式只用来指定满足紧跟在单词 'Chapter' 和一个空格之后的单字符位置的字符集合。这里是第九个字符位置。
如果希望使用范围而不是字符本身来表示待匹配的字符,则可以使用连字符将该范围的开始和结束字符分开。每个字符的字符值将决定其在一个范围内的相对顺序。下面的 Visual Basic Scripting Edition 正则表达式包含了一个等价于上面所示的括号列表的范围表达式。
/Chapter [1-5]/
VBScipt 中相同功能的表达式如下所示:
"Chapter [1-5]"
如果以这种方式指定范围,则开始和结束值都包括在该范围内。有一点特别需要注意的是,在 Unicode 排序中起始值一定要在结束值之前。
如果想在括号表达式中包括连字符,则必须使用下述方法之一:
1. 使用反斜杠将其转义: [\-]
2. 将连字符放在括号列表的开始和结束位置。下面的表达式能匹配所有的小写字母和连字符:[-a-z],[a-z-]
3. 创建一个范围,其中开始字符的值小于连字符,而结束字符的值等于或大于连字符。下面两个正则表达式都满足这一要求: [!--],[!-~]
同样,通过在列表开始处放置一个插入符(^),就可以查找所有不在列表或范围中的字符。如果该插入符出现在列表的其他位置,则匹配其本身,没有任何特殊含义。下面的 Visual Basic Scripting Edition 正则表达式匹配章节号大于 5 的章节标题:
/Chapter [^12345]/
对 VBScript 则使用:
"Chapter [^12345]"
在上面所示的示例中,表达式将匹配第九个位置处除1, 2, 3, 4, or 5 之外的任何数字字符。因此, 'Chapter 7' 为一个匹配,同样 'Chapter 9' 也是如此。
上面的表达式可以使用连字符 (-) 表示。对 Visual Basic Scripting Edition 为:
/Chapter [^1-5]/
或者,对 VBScript 为:
"Chapter [^1-5]"
括号表达式的典型用法是指定对任何大写或小写字母字符或任何数字的匹配。下面的 Visual Basic Scripting Edition 表达式给出了这一匹配:
/[A-Za-z0-9]/
等价的 VBScript 表达式为:
"[A-Za-z0-9]"
限定符
有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
下表给出了各种限定符及其含义的说明:
字符 描述
* 匹配前面的子表达式零次或多次。例如,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?'。请注意在逗号和两个数之间不能有空格。 对一个很大的输入文档而言,章节数很轻易就超过九章,因此需要有一种方法来处理两位数或者三位数的章节号。限定符就提供了这个功能。下面的Visual Basic Scripting Edition 正则表达式可以匹配具有任何位数的章节标题: /Chapter [1-9][0-9]*/
下面的 VBScript 正则表达式执行同样的匹配:
"Chapter [1-9][0-9]*"
请注意限定符出现在范围表达式之后。因此,它将应用于所包含的整个范围表达式,在本例中,只指定了从 0 到 9 的数字。
这里没有使用 '+' 限定符,因为第二位或后续位置上并不一定需要一个数字。同样也没有使用 '?' 字符,因为这将把章节数限制为只有两位数字。在 'Chapter' 和空格字符之后至少要匹配一个数字。
如果已知章节数限制只有99 章,则可以使用下面的 Visual Basic Scripting Edition 表达式来指定至少有一位数字,但不超过两个数字。
/Chapter [0-9]{1,2}/
对 VBScript 可以使用下述正则表达式:
"Chapter [0-9]{1,2}"
上述表达式的缺点是如果有一个章节号大于 99,它仍只会匹配前两位数字。另一个缺点是某些人可以创建一个 Chapter 0,而且仍能匹配。一个更好的用来匹配两位数的 Visual Basic Scripting Edition 表达式如下:
/Chapter [1-9][0-9]?/
或者
/Chapter [1-9][0-9]{0,1}/
对 VBScript 而言,下述表达式与上面等价:
"Chapter [1-9][0-9]?"
或者
"Chapter [1-9][0-9]{0,1}"
'*'、 '+'和 '?' 限定符都称之为贪婪的,也就是说,他们尽可能多地匹配文字。有时这根本就不是所希望发生的情况。有时则正好希望最小匹配。
例如,你可能要搜索一个 HTML 文档来查找一处包含在 H1 标记中的章节标题。在文档中该文字可能具有如下形式:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
下面的表达式匹配从开始的小于号 (<) 到 H1 标记结束处的大于号之间的所有内容。
/<.*>/
VBScript 的正则表达式为:
"<.*>"
如果所要匹配的就是开始的 H1 标记,则下述非贪婪地表达式就只匹配 <H1>。
/<.*?>/
或者
"<.*?>"
通过在 '*'、 '+' 或 '?' 限定符后放置 '?',该表达式就从贪婪匹配转为了非贪婪或最小匹配。
定位符
到现在为止,所看到的示例都只考虑查找任何地方出现的章节标题。出现的任何一个字符串 'Chapter' 后跟一个空格和一个数字可能是一个真正的章节标题,也可能是对其他章节的交叉引用。由于真正的章节标题总是出现在一行的开始,因此需要设计一个方法只查找标题而不查找交叉引用。
定位符提供了这个功能。定位符可以将一个正则表达式固定在一行的开始或结束。也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。下表包含了正则表达式及其含义的列表:
字符 描述
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的 Multiline 属性,
^ 也匹配 '\n' 或 '\r' 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的 Multiline 属性,
$ 也匹配 '\n' 或 '\r' 之前的位置。 \b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。
不能对定位符使用限定符。因为在一个换行符或者单词边界的前面或后面不会有连续多个位置,因此诸如 '^*' 的表达式是不允许的。 要匹配一行文字开始位置的文字,请在正则表达式的开始处使用 '^' 字符。不要把 '^' 的这个语法与其在括号表达式中的语法弄混。它们的语法根本不同。
要匹配一行文字结束位置的文字,请在正则表达式的结束处使用 '$' 字符。
要在查找章节标题时使用定位符,下面的 Visual Basic Scripting Edition 正则表达式将匹配位于一行的开始处最多有两个数字的章节标题:
/^Chapter [1-9][0-9]{0,1}/
VBScript 中相同功能的正则表达式如下:
"^Chapter [1-9][0-9]{0,1}"
一个真正的章节标题不仅出现在一行的开始,而且这一行中也仅有这一个内容,因此,它必然也位于一行的结束。下面的表达式确保所指定的匹配只匹配章节而不会匹配交叉引用。它是通过创建一个只匹配一行文字的开始和结束位置的正则表达式来实现的。
/^Chapter [1-9][0-9]{0,1}$/
对 VBScript 则使用:
"^Chapter [1-9][0-9]{0,1}$"
匹配单词边界有少许不同,但却给正则表达式增加了一个非常重要的功能。单词边界就是单词和空格之间的位置。非单词边界就是其他任何位置。下面的 Visual Basic Scripting Edition 表达式将匹配单词 'Chapter' 的前三个字符,因为它们出现在单词边界后:
/\bCha/
对 VBScript 为:
"\bCha"
这里 '\b' 操作符的位置很关键。如果它位于要匹配的字符串的开始,则将查找位于单词开头处的匹配;如果它位于改字符串的末尾,则查找位于单词结束处的匹配。例如,下面的表达式将匹配单词 'Chapter' 中的 'ter',因为它出现在单词边界之前:
/ter\b/
以及
"ter\b"
下面的表达式将匹配 'apt',因为它位于 'Chapter' 中间,但不会匹配 'aptitude' 中的'apt':
/\Bapt/
以及
"\Bapt"
这是因为在单词 'Chapter' 中 'apt' 出现在非单词边界位置,而在单词 'aptitude' 中位于单词边界位置。非单词边界操作符的位置不重要,因为匹配与一个单词的开头或结尾无关。
选择与编组
选择允许使用 '|' 字符来在两个或多个候选项中进行选择。通过扩展章节标题的正则表达式,可以将其扩充为不仅仅适用于章节标题的表达式。不过,这可没有想象的那么直接。在使用选择时,将匹配'|' 字符每边最可能的表达式。你可能认为下面的 Visual Basic Scripting Edition 和 VBScript 表达式将匹配位于一行的开始和结束位置且后跟一个或两个数字的 'Chapter' 或 'Section':
/^Chapter|Section [1-9][0-9]{0,1}$/
"^Chapter|Section [1-9][0-9]{0,1}$" 不幸的是,真正的情况是上面所示的正则表达式要么匹配位于一行开始处的单词 'Chapter',要么匹配一行结束处的后跟任何数字的 'Section'。如果输入字符串为 'Chapter 22',上面的表达式将只匹配单词 'Chapter'。如果输入字符串为 'Section 22',则该表达式将匹配 'Section 22'。但这种结果不是我们此处的目的,因此必须有一种办法来使正则表达式对于所要做的更易于响应,而且确实也有这种方法。
可以使用圆括号来限制选择的范围,也就是说明确该选择只适用于这两个单词 'Chapter' 和 'Section'。不过,圆括号同样也是难处理的,因为它们也用来创建子表达式,有些内容将在后面关于子表达式的部分介绍。通过采用上面所示的正则表达式并在适当位置添加圆括号,就可以使该正则表达式既可以匹配 'Chapter 1',也可以匹配 'Section 3'。
下面的正则表达式使用圆括号将 'Chapter' 和 'Section' 组成一组,所以该表达式才能正确工作。对 Visual Basic Scripting Edition 为:
/^(Chapter|Section) [1-9][0-9]{0,1}$/
对 VBScript 为:
"^(Chapter|Section) [1-9][0-9]{0,1}$"
这些表达式工作正确,只是产生了一个有趣的副产品。在 'Chapter|Section' 两边放置圆括号建立了适当的编组,但也导致两个待匹配单词之一都被捕获供今后使用。由于在上面所示的表达式中只有一组圆括号,因此只能有一个捕获的 submatch。可以使用 VBScript 的Submatches 集合或者Visual Basic Scripting Edition 中RegExp 对象的 $1-$9 属性来引用这个子匹配。
有时捕获一个子匹配是所希望的,有时则是不希望的。在说明所示的示例中,真正想做的就是使用圆括号对单词 'Chapter' 或 'Section' 之间的选择编组。并不希望在后面再引用该匹配。实际上,除非真的是需要捕获子匹配,否则请不要使用。由于不需要花时间和内存来存储那些子匹配,这种正则表达式的效率将更高。
可以在正则表达式模式圆括号内部的前面使用 '?:'来防止存储该匹配供今后使用。对上面所示正则表达式的下述修改提供了免除子匹配存储的相同功能。对 Visual Basic Scripting Edition:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
对 VBScript:
"^(?:Chapter|Section) [1-9][0-9]{0,1}$"
除了 '?:' 元字符,还有两个非捕获元字符用于称之为预查的匹配。一个为正向预查,用 ?= 表示, 在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串。一个为负向预查,用 '?!' 表示,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
例如,假定有一个包含引用有 Windows 3.1、Windows 95、Windows 98 以及 Windows NT 的文档。进一步假设需要更新该文档,方法是查找所有对 Windows 95、Windows 98 以及 Windows NT 的引用,并将这些引用更改为 Windows 2000。可以使用下面的 Visual Basic Scripting Edition 正则表达式,这是一个正向预查,来匹配 Windows 95、Windows 98 以及 Windows NT:
/Windows(?=95 |98 |NT )/
在 VBScript 要进行同样的匹配可以使用下述表达式:
"Windows(?=95 |98 |NT )"
找到一个匹配后,紧接匹配到的文字(而不包括预查中使用的字符)就开始对下一次匹配的搜索。例如,如果上面所示的表达式匹配到 'Windows 98',则将从 'Windows' 而不是 '98' 之后继续查找。
后向引用
正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对这部分正则表达式的保存。
所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
后向引用一个最简单,最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子:
Is is the cost of of gasoline going up up?
根据所写内容,上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的 Visual Basic Scripting Edition 正则表达式使用一个子表达式就可以实现这一功能。
/\b([a-z]+) \1\b/gi
等价的 VBScript 表达式为:
"\b([a-z]+) \1\b"
在这个示例中,子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符,即由'[a-z]+' 所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词。'\1'用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。如果不这样,则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地识别。
在 Visual Basic Scripting Edition 表达式中,正则表达式后面的全局标志 ('g') 表示该表达式将用来在输入字符串中查找尽可能多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记 ('i') 指定。多行标记指定可能出现在换行符的两端的潜在匹配。对 VBScript 而言,在表达式中不能设置各种标记,但必须使用 RegExp 对象的属性来显式设置。
使用上面所示的正则表达式,下面的 Visual Basic Scripting Edition 代码可以使用子匹配信息,在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词:
var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; file://创建正则表达式样式. var rv = ss.replace(re,"$1"); file://用一个单词替代两个单词. 最接近的等价 VBScript 代码如下:
Dim ss, re, rv
ss = "Is is the cost of of gasoline going up up?." & vbNewLine Set re = New RegExp re.Pattern = "\b([a-z]+) \1\b" re.Global = True re.IgnoreCase = True re.MultiLine = True rv = re.Replace(ss,"$1") 请注意在 VBScript 代码中,全局、大小写敏感性以及多行标记都是使用 RegExp 对象的适当属性来设置的。
在replace 方法中使用 $1 来引用所保存的第一个子匹配。如果有多个子匹配,则可以用 $2, $3 等继续引用。
后向引用的另一个用途是将一个通用资源指示符 (URI) 分解为组件部分。假定希望将下述的URI 分解为协议 (ftp, http, etc),域名地址以及页面/路径:
下面的正则表达式可以提供这个功能。对 Visual Basic Scripting Edition,为:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
对 VBScript 为:
"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
第一个附加子表达式是用来捕获该 web 地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三个附加子表达式捕获网站端口号码,如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后,第四个附加子表达式捕获由该 web 地址指定的路径以及\或者页面信息。该子表达式匹配一个和多个除'#' 或空格之外的字符。
将该正则表达式应用于上面所示的 URI 后,子匹配包含下述内容:
RegExp.$1 包含 "http"
RegExp.$2 包含 "msdn.microsoft.com"
RegExp.$3 包含 ":80"
RegExp.$4 包含 "/scripting/default.htm" win2003IIS的父路径今天在win2003IIS中调试了一段IP搜索的ASP代码,结果IIS暴错
Active Server Pages 错误 'ASP 0131' 不允许的父路径 /admin/index.asp,行 1 包含文件 '../Conn.asp' 不能用 '..' 表示父目录。 看了看原代码也没什么问题,它说不允许的父路径,FT,看了半天,在IIS的主目录--配置--选项中有一个复选项“允许父路径”,选中确定以后终于正常了,不了解2003怎么做个这个东东。 June 07 电脑游戏中的人工智能制作选择自 ghj1976 的 Blog 电脑游戏随着硬件执行效率与显示解析度等大幅提升,以往很多不可能或非常难以实现的电脑游戏如此都得以顺利完成。虽然电脑游戏的呈现是那么地多样化,然而却与我们今日所要探讨的主题,人工智能几乎都有着密不可分的关系。 导向式思考 AI最容易制作的的方式,同时也是早期游戏AI发展的主要方向就是规则导向或称之为假设导向。在一些比较简单的电脑游戏中,程序员可以好不困难地将游戏中的规则与设定转化成一条条的规则,然后将它们写成电脑程序。让我们以角色扮演游戏为例。决大多数的企画在设定所谓电脑怪物时,所设定的属性通常有以下几种: 生命值 攻击力 防御力 法力 属性 最后一个“属性”是我在设定时喜欢增加的项目之一。透过这项属性的设定,我可以把怪物设定成“贪生怕死的”,也可以把战士设定为“视死如归”。以目前我们所掌握的资料,在战门系统中的大纲如是诞生了: 规则一 if (生命值< 10) // 边临死亡了吗 规则二 由以上一连串的“如果--就--”规则设定,建立了最基本的AI。说这样的制方式只能建立基本AI其实并不当然正确。只要建立足够及精确的规则,这样的方式仍然有一定水准的表现。 推论式思考 相信曾经接触过电脑语言课程,或是自习过相关书籍的朋友们,都曾曾经听过一个著名的程序,那就是井字游戏。用井字游戏作为讨论AI的入门教材,我个人觉得是最适当的例子。或许有人还不知道井字游戏怎么玩。只要任何一方在三乘三的方格中先先成一线便胜利了。我们在前面谈过的规则导向,在这里也可以派得上用场。 if任何一线已有我方两子&&另外一格仍空//我方即将成一线吗 有一次我在某本电脑书上,同样地也看到某些以井字游戏为介绍的范例。不同的是,我几乎看不到任何规则导向的影子。但在仔细分析该程序码后,我得到了极大的启发,原来AI是可以不用这么多规则来制作的。它用的方法正是在电脑AI课程中重要的概念:极大极小法。我在这里只说明这法则的概念。继续以井字游戏为例,电脑先在某处下子,接着会以假设的方式,替对方下子,当然,必须假设对方下的是最佳位置,否则一切则毫无意义。在假设对方下子的过程中,自然又需要假设我方的下一步回应,如此一来一往,直到下完整局游戏为止。 底下是节录书中的程序片段: 国外的一些论坛曾举行过256字节的游戏设计比赛。作品非常多,其中有一件作品正巧也是井字游戏。作者用区区两百多行就写了与上述程序演算方式完全相同的作品,可见功力确实了的。另外,我也很希望类似的活动能在国内推展起来。对了,在这样的比赛条件限制下,除了汇编语言外,几乎没有其它的选择了。 程序员的爱情~~,HEHE打开Microsoft Visual(R) C ++ , 选择 Win32 Console Application 工程 将本程序Love.cpp 引入 哈哈计算机都被感动了!^_^ // It's my first love letter in my life 这是我这辈子写的第一封情书 //#include<love.h> 加入背景音乐看了半天都找不到HTML编辑模式,结果search以下才发现. 这个是老外的原文: Edit It ButtonDrag the link below into your link toolbar! Right click on your toolbar to display the link toolbar if it is not visible. If you can't drag this link (Windows sp2), right click on the link and add it to your favorites. Specify the "Links" directory and it will show up on your toolbar. 首先确认你的IE浏览器工具栏中是否有“链接(Link)”这一项,如果没有,那么点击“查看”菜单,在“工具栏”选项中将“链接(Link)”挑上勾。SP2的XP系统"添加到收藏夹"就行了.然后访问下面这个网站: Ok,到你的MSN Space中新添加一篇日志,输入文字前,点击“Edit It”,看一看编辑工具栏是不是多出了几个图标,剪切、复制、粘贴、字形、字号都有了,再配合原来的加粗、斜体、文字颜色等,处理文本应该绰绰有余了。 点击"用 HTML 创建您的网页。 — 直接编辑 HTML 格式命令。",现在编辑区变成了源码的形式显示了,能编辑源码就好办多了,一切都没有问题.要想加入背景音乐,只要这个代码就行了: dynsrc=音频链接地址 将http://*/13.mp3 改成你要用的的音乐地址就可以了。 注意:地址与width之间要有空格/使用mp3、mid、wma等作为背景音乐 提示个小东西:回车的时候用shift+回车能得到更小的行距,试试~~HEHE 从事游戏开发行业,首先你得学会这是别人写的,觉得写的还不错,有同感,也从中有所启发: 第一,熟悉一种编程语言,比如c,c++或者java, 然后,可以根据自己的兴趣和发展方向,可以选择以下方向学习: 然后是游戏开发方面的经验积累了,结合前面的程序练习,先做几个小游戏,比如俄罗斯方块,挖地雷之类的,主要是培养信心和兴趣。然后逐渐升级,做点战棋和RPG。最后学到3D引擎编码的时候,就做个3D赛车游戏吧,贴图不漂亮没关系,又不卖,只是自己长经验吧。 这种水平,应该有机会到游戏公司了,这样可以接触到他们买的世界上比较先进的游戏引擎,有前文的基础,什么东东都不用怕,一两个月就可以干得普普通通,一两年就可以骨干,三五年就可以核心,年薪几十万指日可待。(说起来容易,要达到这个高度,对于一个新手来说真的是好困难的,努力) 后记(网络~彦色):游戏制作不比其他软件开发,从初步了解的一些知识来看,其综合性很强,有图形图像\网络\加密\人工智能\多媒体\数据库等等一系列的东西,会一门语言甚至精通,要想开发一款游戏也不是那么容易的,就象上面所说的,你还得学习DX或者OPENGL 等接口的东西,总之这个行业是个门槛很高的行业,不过还是有那么多人喜欢,不只是因为薪水高,也许更多的是处于对它的热爱和兴趣,就象NPC6说的一样"何苦做游戏" May 31 马化腾还能挺多久?腾讯:马化腾还能挺多久? 来源:http://www.boraid.com May 30 香水知识知多少~~香水是由香精稀释在酒精和蒸馏水中,依据不同的比例生产而成的。香精又分为天然原料和化学合成原料。酒精的作用则是稀释香精,保持香味,以及最后促成香水香味的挥发。 香水的色彩 红色 国际市场男用香水经典品牌
切维浓:即城市猎人,是来自法国的前卫男用香水系列。具有清新敏感的芳香,予以不可思议的男性魅力,它浪漫,潇洒不拘,传达出代表五、六十年代美国式梦想和精神,更有一种追求悠闲年代的生活品味。享用“城市猎人”香水系列的男性族群,兼具革新和古典的气质仿佛置身于宽广的生活空间并追求自然原始的官能享受,也代表着成熟、坚韧。 哈利:当美国硕果仅存的名牌哈利摩托制造厂授权意大利著名香水厂制造的哈利香水上市后。立即激起全球香水市厂的轰动。它不仅是好莱坞明星,流行歌手们最喜欢的香水,亦是企业家,社会名流,上层社会男士常备的香水,因为这种香水象征着他们的成就与权力。为了表现出男士们的特质,哈利香水创造出了一股强而有力和令人振奋的气息,是一种充分体现男性美感的香水。在不同的心境下,它代表着勇敢、冒险、高尚、优雅、精练和多情的感觉。 兰堡No.6:火辣辣、鲜美、冷静的香型是男用香水生气勃勃的标志,其配方多采用柠檬、橙花油及迷迭香,1752年出品的兰堡NO.6是其代表,它是美国第一任总统乔治-华盛顿最喜爱的香水。今天在纽约,人们仍能买到它。 兰德尔:随着男用香水渐渐普及,其香型也由清新提神作用而转为表现性感魅力的标志。其中最为典型的就是兰德尔,它是由英国最古老的香水制造厂YARDLER于1913年推出的。这种香水除了有熏衣草油外,还有一定比例的橙花油和檀香,三者都能产生性的幻想。 凯热No.10:1929年上市的维也纳香水凯热NO.10也是这类香水的佼佼者,NO.10是马球运动的最高分,这种香水推出时,打着为知识男性服务的口号。他的征服者包括指挥大师赫伯特-冯-卡拉杨。 奥德:1936年开始在美国曼哈顿销售的奥德。恩佩斯少了那么一点势利,他的香型包括了丁香,肉桂,香草及诱人的麝香,装在洁白纯净的瓶子里,一时成为二战期间美国军人装备的必备物。直到今天,它仍是美国人最爱的须后水。 第凡内:优雅的欧洲绅士风格,以玫瑰香型为主,混合森林环保基调,由第凡内公司出品,每盎司高达200美元。 小马车:艾尔媚的招牌香水,其男用品系独有男性气质和阳刚之美,每盎司170至200美元。 鸦片:圣罗郎出品,有浓郁的东方香味,神秘而具男性魅力,是国际市场上又一经典的男性香水品牌,每盎司约170美元。
香水牌子很多,以下是比较有名的: Anna Sui 安娜苏 May 29 电脑小技巧,实用信息来源:黑白网络 你可以用ctrl+f来查找你定位你要看的内容 May 27 香水~~最近对香水越来越感兴趣,不经意间在时尚论坛看到一个介绍各大香水品牌帖子,如获至宝,收藏!http://bbs.trendsmag.com/showthread.php?s=&threadid=256384&highlight=%CF%E3 http://bbs.trendsmag.com/showthread.php?s=&threadid=204492&perpage=15&highlight=香&pagenumber=1 早期的男士香水,我们叫做古龙水的,就是Eau de Cologne,香精含量最低,比较清淡的,至今也有品牌生产,有一批忠实客户。 May 25 各地的VPI/ VCI/ DNS各地的VPI/ VCI/ DNS 2004年5月14日数据整理 城市 VPI VCI DNS 辽宁 北京 0 35 202.106.196.152 广东 惠州 0 100 202.96.134.133 广州 8 35 61.144.56.100 浙江 贵州 湖北 宜昌 202.103.44.5 荆州 8 81 202.103.0.68 吉林 江西 河北 内蒙古 安徽 上海 8 35 202.96.209.133 成都 1 33 202.98.96.68 西安 8 35 61.134.1.4 苏州 8 35 202.102.14.141 常州 8 35 202.96.209.5 宁波 0 33
重庆电信: 重庆铁通: 四川 0 35 61.139.2.69 徐州 8 35 南京 8 35 202.102.24.35 山西 山东 黑龙江 四川 广西 湖南 导入注册表不提示首先打开记事本,输入: |
|
|