赞 | 6 |
VIP | 4 |
好人卡 | 58 |
积分 | 5 |
经验 | 58579 |
最后登录 | 2024-6-30 |
在线时间 | 1478 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 508
- 在线时间
- 1478 小时
- 注册时间
- 2011-9-17
- 帖子
- 1316
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 iisnow 于 2011-10-23 23:13 编辑
真正的新手请赶紧学习RM中的帮助部分,以及66站的教程
相信几天后就可以写脚本了,正则表达式还是有点难度的;
要是能大致或者想懂得XP中Window_Message类中第77到100行在做什么,但是不敢顺便改的同学
请往下面看吧:
申明:
1.我的教程可能有我说话风格——想到什么说什么,不喜欢就记得和我说,我会尽量改的
2.教程中为了速度着想,有些代码是直接输入,没有用代码框(新手不要老想着复制粘贴什么的)
3.由于内容很多(我讲的还算比较细吧),分多节讲
4.出于个人的理解不同,用语各种不恰当,懂的话将就看吧,忍不了了就告诉我,会改的
5.最最重要的一点,我也算是新手,若有错误,希望指正,谢谢
本节内容:
1.大致介绍正则表达式以及买一下萌
2.正则表达式的建立及匹配的概念
3.字符簇的讲解(本节重点)
开始了:(无条理,请跟着我的吐槽学……= =)
RUBY语言中最好玩、最有用、最精华的数据结构是什么?
每个人都会有不同的回答,但是我始终觉得是String!!
因为字符串这种结构可以储存的信息实在太多了,- "yuaodkn782hjr83ijfn"
- "哈哈哈哈哈哈哈←有病啊…\n"
复制代码 以上都是字符串
大家要是知道to_s方法,那么多半是在将数值转字符串用于显示的吧
但是to_s方法是在Object类里面定义的……所以所有的类都可以使用to_s转成字符串!
(除非,你自己建一个类,把to_s方法禁止掉…= =有必要吗)
既然字符串可以储存这么多类的信息,我们怎么把信息依我们的需求提取出来呢
有一个办法就是使用正则表达式(Regular expressions→(简写为)Regexp)
(要学会学习一种东西,要追求多方面的学习,我的观点是有限的,于是多提供几个教程 吧:
http://www.rubular.com/ (版本不新,可能下面的例子都有不支持的)
在线编辑正则表达式学习,可以开着这个看下文,要用英文输入法啊,否则就郁闷了
当然出于实用性考虑,还是用RM实践吧,RUBY语言发展的那么快,谁知道更没更新
http://rpg.blue/manual/ruby/built-in-class/class_object_regexp.html
66网站上的,已经很详细了 (但感觉不系统)
http://www.ruby-doc.org/core-1.9.2/Regexp.html
这个够权威吧,1.9.2够新吧,不过英语的!
)(题外话)
(发现我好多废话)真正开始了(再废话:不只是RUBY有正则表达式,但是下面讲的知识RUBY方面的):
Regexp类是Object的子类,用于定义一种字符串样式;
样式的一般表示形式:- /………………/ #(用两个"/"括起)(下面全部是这种方式)
- %r{…………}
复制代码 建立一个Regexp类一般就用Regexp.new(str)或者Regexp.compile( str )
写作- iisnow = Regexp.compile(/cool/)
复制代码 或者懒一点直接也可以通过间接定义
如:- iisnow = "shangbuqi"
- /#{iisnow}/ #就等同于 /shangbuqi/
复制代码 (同志们,我们别讲太复杂了,先就一个参数的吧,修饰符在后面说)
接着使用 string.match(reg) 或者 reg =~ string 来进行匹配
如- iisnow = /ool/
- iisnow =~ 'coololcoololi'
复制代码 如果字符串中有符合匹配表达式的部分则成为“字符串匹配该样式”
那么上式会输出第一个与之匹配字符串的首字符索引值- p iisnow =~ 'coololcoololi' # => 1
复制代码 用- 'coololcoololi'.match(iisnow)
复制代码 则会获得MatchData类(这个后面讲)
而不匹配则统一返回nil(下述例子均按 =~ 的方式给出)
所以要讲一下匹配的规则
首先字符的相互匹配就是指“是不是一样的”←浅显
"s" 匹配 /s/
"^" 匹配 /^/
字符串的匹配则略微有包含的意味:
/cool/被所有包含cool段的字符串匹配(注意cool四个字符是连续存在的)
转义字符(元字符):
在有些时候有些字符不能直接输入,或者说那些字符在表达式中有别的用处
则需要转义匹配: \? 匹配 '?' 字符,就是在它之前加一个 '\' 即可
需要转义的特殊字符有: ( ) [ ] { } . ? + * - 等等
称为元字符(metacharacter)
另外 \s \n \t 等等就不用说的吧(不知道的话,自己看RM帮助字符串的控制码部分)
(不过下面还是会介绍一下的)
(但是这里注意,用到控制码的话,单引号和双引号字符串就有差别了)
于是大家读pattern(样式,即正则表达式,下同)的时候,‘\’ 可以不读,跳过
(当然要记住后面的那个字符除了匹配自身以外没有别的功能,另外控制码也要留心)
所以- iisnow = /co\+o\sl\?/ #是否能匹配
- 'co+o l+?c o+ol? l' #呢?
复制代码 说完转义,那么肯定就有人问,既然转义的那些字符有别的用处,那到底有什么用啊?
好,下面开始一个个的来讲,
先说"[","]"这两个:
/ab/ 匹配的时候必须要有a,b连着,就是说匹配两个字符的
/[ab]/ 匹配则是a或者b,就是说匹配一个字符的
当然[]里面可以包含任意多的字符(可以重复),但是只匹配一个字符(叫做字符簇)
其实就是说[]里面的每一个字符都是用 OR 连接着
(字符簇不可为空,否则属于发生 SyntaxError )
由于只匹配一个字符,也可以将[]本身加入[]中(嵌套)- /[al[6b]iu]/ #就等同于
- /[al6biu]/ #(虽然很无聊,但是是对的)
复制代码 字符其中当然可以包含转义字符[] 可以与 "-" 连字符 一起使用,用来表示范围(range)
比如你想匹配任意一个字母(当然还有别的方法)- /[abcdefghijklmnopqrstuvwxyz]/ #打的不累吗?
- /[a-z]/ #就等同于上式
复制代码 范围有叠加能力(允许重叠,且顺序不计):- /[abcdopqr]/ #则等同于 /[a-do-r]/
- /[2345hijk]/ #等同于 /[2-5h-k]/
- /[a-kd-o]/ #等同于 /[a-o]/
复制代码 当范围与单个字符一起写的时候,不要混乱了- /[ax-zt5e-ku]/ #就匹配 5, a, e-k, t, u, x-z
复制代码 其实就相当于并集的概念
既然有并集,那么就有交集操作、也有补集操作:
交集: "&&" /[a-l&&h-r]/ 等同于 /[h-l]/
补集(或者叫非):用于整个"[]"样式的开头- /[^a-fm-lou-z]/ #就是指 匹配不被 /[a-fm-lou-z]/ 匹配的字符
复制代码 ("^" 本身是一个字符,在它不在[]的开头时,只是匹配 "^" 这个字符而已,这一点要注意,帮助文件中有提到过,我记得)
当这些操作可以结合起来:(哈哈哈哈,有点纠结了吧)- /[a-w&&[^f-m]z]/ # 就相当于 /[a-en-w]/
复制代码 上述pattern中的 "z" 由于pattern是 (a-w) AND(!(f-m) OR z)
故不包含
于是有优先级的问题:
首先遇到嵌套或者 "^"在[]首位的时候,先把他的"[]"变成括号,然后将各级各个括号里面按"&&"分成各个部分,先计算括号内,再计算括号外;计算各个部分,最后求总交集- /[ya-p&&[^b-m&&h-p]i-q&&k-vf]/
复制代码 试着分析一下……= =
提示:(y OR a-p) AND { ![(b-m) AND (h-p)] OR i-q } AND ( k-v OR f )
(这已经是相当蛋疼的部分了,因为没有谁会把pattern写成这副德行,但是你得懂!!)
(RM实验)在Main里面的begin下面插入下列代码:- iisnow = /[ya-p&&[^b-m&&h-p]i-q&&k-vf]/
- for i in "a".."z"
- iisnow =~ i
- if Regexp.last_match != nil
- p Regexp.last_match[0]
- end
- end
- exit
复制代码 就可以知道表达式包含了什么了(自恋的代码)
顺便自己输入几个,验证一下
[]就差不多了
今天就这么多吧,内容比较少,但是累了…
估计这个星期会来2吧
1_iisnow.rar
(3.12 KB, 下载次数: 301)
这是 txt 的……= =
|
评分
-
查看全部评分
|