设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2894|回复: 3
打印 上一主题 下一主题

[通用发布] 正则表达式之准新手脚本教学(略浅)(1)

[复制链接]

Lv2.观梦者

梦石
0
星屑
508
在线时间
1478 小时
注册时间
2011-9-17
帖子
1316

开拓者贵宾

跳转到指定楼层
1
发表于 2011-10-23 22:29:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 iisnow 于 2011-10-23 23:13 编辑

真正的新手请赶紧学习RM中的帮助部分,以及66站的教程
相信几天后就可以写脚本了,正则表达式还是有点难度的;

要是能大致或者想懂得XP中Window_Message类中第77到100行在做什么,但是不敢顺便改的同学
请往下面看吧:

申明:
1.我的教程可能有我说话风格——想到什么说什么,不喜欢就记得和我说,我会尽量改的
2.教程中为了速度着想,有些代码是直接输入,没有用代码框(新手不要老想着复制粘贴什么的)
3.由于内容很多(我讲的还算比较细吧),分多节讲
4.出于个人的理解不同,用语各种不恰当,懂的话将就看吧,忍不了了就告诉我,会改的
5.最最重要的一点,我也算是新手,若有错误,希望指正,谢谢

本节内容:
1.大致介绍正则表达式以及买一下萌
2.正则表达式的建立及匹配的概念
3.字符簇的讲解
(本节重点)

开始了:(无条理,请跟着我的吐槽学……= =)

RUBY语言中最好玩、最有用、最精华的数据结构是什么?
每个人都会有不同的回答,但是我始终觉得是String!!

因为字符串这种结构可以储存的信息实在太多了,
  1. "yuaodkn782hjr83ijfn"
  2. "哈哈哈哈哈哈哈←有病啊…\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的子类,用于定义一种字符串样式
样式的一般表示形式:
  1. /………………/     #(用两个"/"括起)(下面全部是这种方式)
  2. %r{…………}
复制代码
建立一个Regexp类一般就用Regexp.new(str)或者Regexp.compile( str )
写作
  1. iisnow = Regexp.compile(/cool/)
复制代码
或者懒一点直接
  1. iisnow = /cool/
复制代码
也可以通过间接定义
如:
  1. iisnow = "shangbuqi"
  2. /#{iisnow}/      #就等同于   /shangbuqi/
复制代码
(同志们,我们别讲太复杂了,先就一个参数的吧,修饰符在后面说)

接着使用  string.match(reg)  或者  reg =~ string 来进行匹配
  1. iisnow = /ool/
  2. iisnow =~ 'coololcoololi'
复制代码
如果字符串中有符合匹配表达式的部分则成为“字符串匹配该样式”
那么上式会输出第一个与之匹配字符串的首字符索引值
  1. p iisnow =~ 'coololcoololi' # => 1
复制代码
  1. 'coololcoololi'.match(iisnow)
复制代码
会获得MatchData类(这个后面讲)

而不匹配则统一返回nil(下述例子均按 =~ 的方式给出)

所以要讲一下匹配的规则

首先字符的相互匹配就是指“是不是一样的”←浅显
"s"    匹配     /s/     
"^"   匹配    /^/
字符串的匹配则略微有包含的意味:
/cool/被所有包含cool段的字符串匹配(注意cool四个字符是连续存在的)

转义字符(元字符)
在有些时候有些字符不能直接输入,或者说那些字符在表达式中有别的用处
则需要转义匹配:  \?    匹配     '?'    字符,就是在它之前加一个  '\'  即可
需要转义的特殊字符有:  (   )   [   ]   {   }   .   ?   +   *  - 等等
称为元字符(metacharacter)

另外   \s \n \t  等等就不用说的吧(不知道的话,自己看RM帮助字符串的控制码部分)
(不过下面还是会介绍一下的)
(但是这里注意,用到控制码的话,单引号和双引号字符串就有差别了)
于是大家读pattern(样式,即正则表达式,下同)的时候,‘\’  可以不读,跳过
(当然要记住后面的那个字符除了匹配自身以外没有别的功能,另外控制码也要留心)

所以
  1. iisnow = /co\+o\sl\?/     #是否能匹配
  2. 'co+o l+?c o+ol? l'        #呢?
复制代码
说完转义,那么肯定就有人问,既然转义的那些字符有别的用处,那到底有什么用啊?
好,下面开始一个个的来讲,

先说"[","]"这两个:

/ab/      匹配的时候必须要有a,b连着,就是说匹配两个字符的
/[ab]/    匹配则是a或者b,就是说匹配一个字符的

当然[]里面可以包含任意多的字符(可以重复),但是只匹配一个字符(叫做字符簇
其实就是说[]里面的每一个字符都是用 OR 连接着
(字符簇不可为空,否则属于发生   SyntaxError  )

由于只匹配一个字符,也可以将[]本身加入[]中(嵌套)
  1. /[al[6b]iu]/  #就等同于
  2. /[al6biu]/    #(虽然很无聊,但是是对的)
复制代码
字符其中当然可以包含转义字符
  1. /[\snow\?]/    #你们说它匹配什么?
复制代码
[] 可以与  "-"  连字符  一起使用,用来表示范围(range)
比如你想匹配任意一个字母(当然还有别的方法)
  1. /[abcdefghijklmnopqrstuvwxyz]/      #打的不累吗?
  2. /[a-z]/       #就等同于上式
复制代码
范围有叠加能力(允许重叠,且顺序不计):
  1. /[abcdopqr]/   #则等同于   /[a-do-r]/
  2. /[2345hijk]/    #等同于   /[2-5h-k]/
  3. /[a-kd-o]/       #等同于   /[a-o]/
复制代码
当范围与单个字符一起写的时候,不要混乱了
  1. /[ax-zt5e-ku]/    #就匹配  5,  a,  e-k,  t,  u,  x-z
复制代码
其实就相当于并集的概念

既然有并集,那么就有交集操作、也有补集操作:
交集: "&&"    /[a-l&&h-r]/  等同于  /[h-l]/
补集(或者叫非):用于整个"[]"样式的开头
  1. /[^a-fm-lou-z]/    #就是指   匹配不被   /[a-fm-lou-z]/  匹配的字符
复制代码
("^" 本身是一个字符,在它不在[]的开头时,只是匹配 "^" 这个字符而已,这一点要注意,帮助文件中有提到过,我记得)

当这些操作可以结合起来:(哈哈哈哈,有点纠结了吧)
  1. /[a-w&&[^f-m]z]/  # 就相当于   /[a-en-w]/
复制代码
上述pattern中的 "z" 由于pattern是   (a-w) AND(!(f-m) OR z)
故不包含

于是有优先级的问题:
首先遇到嵌套或者 "^"在[]首位的时候,先把他的"[]"变成括号,然后将各级各个括号里面按"&&"分成各个部分,先计算括号内,再计算括号外;计算各个部分,最后求总交集
  1. /[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下面插入下列代码:
  1. iisnow = /[ya-p&&[^b-m&&h-p]i-q&&k-vf]/  
  2.   for i in "a".."z"
  3.     iisnow =~ i
  4.     if Regexp.last_match != nil
  5.       p Regexp.last_match[0]
  6.     end
  7.   end
  8.   exit
复制代码
就可以知道表达式包含了什么了(自恋的代码)
顺便自己输入几个,验证一下

[]就差不多了
今天就这么多吧,内容比较少,但是累了…
估计这个星期会来2吧
1_iisnow.rar (3.12 KB, 下载次数: 301)
这是 txt 的……= =

评分

参与人数 3星屑 +866 收起 理由
fux2 + 666 辛苦
各种压力的猫君 + 140 鼓励教程 期待后续
时光机 + 60 好东西,收了,正想学呢

查看全部评分

我帖子中要有是不HX的空白,请Ctrl + A

Lv1.梦旅人

被遗忘の机器

梦石
0
星屑
73
在线时间
402 小时
注册时间
2010-7-24
帖子
1492
2
发表于 2011-10-23 22:58:36 | 只看该作者
好东西啊,正发愁不会呢

点评

谢谢支持啦~  发表于 2011-10-23 23:15
【镇楼】少年吃我大屌
回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
728
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

3
发表于 2011-10-24 04:30:26 | 只看该作者
正则表达式虽然不难,但是非常之容易犯错 =。= 期待LZ讲解常见错误及避免方法。

另:
http://www.ruby-doc.org/core-1.9.2/Regexp.html
    这个够权威吧,1.9.2够新吧,不过英语的!
笑而不语

点评

这个版本的问题,斑竹君放心,我每一个例子都会用RM实验再写上去的  发表于 2011-10-24 09:17
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42344
在线时间
7599 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

4
发表于 2011-10-24 08:25:38 | 只看该作者
术语不懂,咱只会用。

点评

惊现触手鸡  发表于 2011-10-24 12:36
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 20:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表