Project1

标题: 水蓝的脚本教程之正则表达式 [打印本页]

作者: dbshy    时间: 2008-10-27 18:13
标题: 水蓝的脚本教程之正则表达式
本帖最后由 后知后觉 于 2009-12-10 16:57 编辑

此教程是写给和我一样的新人,高手直接54就好 >_<

什么是正则表达式呢?
我的理解就是用简洁的语句来实现模式串匹配,不用自己写一大段代码去实现 = =

大家刚开始去接触正则表达式的时候,会觉得这些表达式非常难以理解,不知道在写些什么
但看懂后,会觉得非常简单

现在就来讲怎么来使用,下面讲两个比较简单和常用的
string[/self/]
当string 含有 self 的时候 返回self
这个用来搜索string中是否含有模式串

str = "foofoofoo"
p str[/foo/]  #=>"foo"

self =~ string
与 string 字符串进行正则表达式的匹配操作。
返回index

p "foo" =~ /foo/ #=>0
还有的方法请参考Regexp类,相信不难理解


接下来就是此讲的重点和难点了,大家要听好了
先看下面的一些语句

"foo" =~ /foo/
"md123556cd324dsw241" =~ /md(\d+)cd(\d+)dsw(\d+)/
"v[1]" =~ /\\[Vv]\[([0-9]+)\]/

是不是有点晕,稳住,咱来一条一条慢慢讲

首先,//之间的就是要匹配的string,第一个的foo就是要匹配的string
但后面几个就出现很多看不懂的符号 = =

这些看不懂的符号就是ruby支持的正则表达式符号(元字符)
有这么个规则:
不带\的数字和字母不是元字符
带\的符号也不是元字符

元字符进行匹配的时候,不是直接用指定的string来匹配,而是用元字符代表的范围来进行范围匹配

下面就是一些比较常见的元字符的意义
更多的规则请参看f1 or 参考手册

\w
匹配包括下划线的任何字母数字字符。等同于[0-9A-Za-z_]。
中文的全角字符也匹配。

\W
匹配任何非字母数字字符。\w 以外的字符。

\s
匹配任何空字符,包括空格、制表符、换页符等等。等同于[ \t\n\r\f\v]。

  \S
匹配任何非空字符。[ \t\n\r\f\v]以外的字符。

\d
匹配一个数字字符。等同于[0-9]。

\D
匹配一个非数字字符。

  +
负责指定数量(quantifiers)。表示前面子表达式至少出现 1 次

+?
负责指定数量(quantifiers)。表示前面子表达式至少出现 1 次(尽量匹配短的部分)。

{m}
{m,}
{m,n}
指定子表达式重复出现的次数(interval quantifier)。分别表示前面子表达式重复出现

m 次
至少 m 次
至少 m 次,至多 n 次


  有了上面的基础作为铺垫,继续看/\md(\d+)cd(\d+)dsw(\d+)/
  md,cd,dsw 就是匹配 md,cd,dsw
  \d根据上面的元字符的讲解就是 匹配一个数字字符,等同于[0-9]
  d后面的+号指的是前面的表达式(也就是数字)至少出现一次
  最后来讲这个括号,()并不能进行匹配,但可以在匹配成功后,抽出匹配部分并存在$1,$2.....中
  所以当你p $1,$2,$3 的时候,显示出来的是123556,324,241

  再看下一个/\\[Vv]\[([0-9]+)\]/
  \\前面的一个\是转义,匹配的是\这个符号
  后面的 [ 和 ] 前面的\也是转义,匹配的是[ 和 ]这两个符号
  [Vv] [0 - 9] 正则表达式 [] 负责指定字符簇,这将匹配 [] 内列出的任何一个字符
  Vv匹配 V or v [0 - 9 ] 匹配 0 -9 (加入- 必须按照ascii码)
  ()的意思在上面已经讲了 ,+号就是前面的数字可以出现一次或多次,1,25这样都行
   有兴趣的话,还可以看一下 window_message中的正则,这个就是从那里面选出来的

  写了这么多,不知道大家看懂没有,下面留个作业 = =bbb
  很简单,大家不妨一试
  提取[]中的内容
  "<头像名[actor1]头像编号[0]背景[0]位置[2]>"   ==>["actor1",0,0,2]
  参考答案(此问题来自vx提问区)
作者: 大地的雨    时间: 2008-10-27 21:48
很正规的一片教程,这功能在XP差不多都用在对话框部分了,不过在VX可特别好用哦!lol
作者: 猫哥哥    时间: 2008-10-27 21:51
虽然很不想打击楼主的积极性,但是论坛里好像已经有发布过的正则表达式教程了{/hx}
作者: 大地的雨    时间: 2008-10-27 21:56
以下引用猫哥哥于2008-10-27 13:51:48的发言:
虽然很不想打击楼主的积极性,但是论坛里好像已经有发布过的正则表达式教程了

看到猫哥哥,捏一个!
话说刚才忘记说了,LZ是叫新手吗?=v=
作者: 柳之一    时间: 2008-10-27 23:01
以下引用猫哥哥于2008-10-27 13:51:48的发言:

虽然很不想打击楼主的积极性,但是论坛里好像已经有发布过的正则表达式教程了

不过那篇讲的不全,虽然这篇也是不全。
不过感觉这个我更能理解,正则是我最弱的部分,至今很迷惑

http://rpg.blue/viewthread.php?tid=91181&ntime=2008%2D10%2D27+14%3A57%3A24
作者: dbshy    时间: 2008-10-31 04:08
以下引用柳之一于2008-10-27 15:01:53的发言:
不过那篇讲的不全,虽然这篇也是不全。
不过感觉这个我更能理解,正则是我最弱的部分,至今很迷惑


这片教程确实写的不全,我的目的是给新手看的,而且本人技术废柴 = =
你可以去看参考手册

以下引用猫哥哥于2008-10-27 13:51:48的发言:

虽然很不想打击楼主的积极性,但是论坛里好像已经有发布过的正则表达式教程了

我觉得有发布过类似的,也同样可以写
因为教程不同于脚本之类,写了就没必要再浪费精力

看了下HIDE秀前辈的,我觉得我的更适合给新手看{/hx}

作者: 柳之一    时间: 2008-10-31 06:22
以下引用dbshy于2008-10-30 20:08:11的发言:


以下引用柳之一于2008-10-27 15:01:53的发言:
不过那篇讲的不全,虽然这篇也是不全。
不过感觉这个我更能理解,正则是我最弱的部分,至今很迷惑



这片教程确实写的不全,我的目的是给新手看的,而且本人技术废柴 = =
你可以去看参考手册


以下引用猫哥哥于2008-10-27 13:51:48的发言:

虽然很不想打击楼主的积极性,但是论坛里好像已经有发布过的正则表达式教程了


我觉得有发布过类似的,也同样可以写
因为教程不同于脚本之类,写了就没必要再浪费精力

看了下HIDE秀前辈的,我觉得我的更适合给新手看



[本贴由作者于 2008-10-30 20:09:04 最后编辑]

懒得翻手册了,就看你的好了{/hx}
作者: hide秀    时间: 2008-10-31 17:18
{/qiang}还是支持范例式教学 多举例才容易看懂{/wx}
作者: 猫哥哥    时间: 2008-11-1 10:11
以下引用柳之一于2008-10-27 15:01:53的发言:
不过那篇讲的不全,虽然这篇也是不全。
不过感觉这个我更能理解,正则是我最弱的部分,至今很迷惑


如果真的想弄懂,可以去买本书。

推荐一本书,叫作《正则表达式必知必会》,英文名《Teach Yourself Regular Expressions in 10 Minutes》,作者Ben Forta,海淀图书城有售,大概10来块的样子(我买的时候有折扣)。内容讲的是正则表达式的通理,看完了差不多ruby的正则表达式你也就会用了。看书的英文名,就是“10分钟自学学会正则表达式”,10分钟虽然是夸张了一点,但是也能一两个小时内读完,并搞清楚一些复杂的概念了。

另外还有本叫什么“正则表达式大全”的,很厚,内容超级详细,谈到了正则表达式的方方面面,但是在ruby里没必要也用不到那么复杂(不推荐)。

以下引用大地的雨于2008-10-27 13:56:47的发言:
看到猫哥哥,捏一个!
话说刚才忘记说了,LZ是叫新手吗?=v=

为什么要捏俺(羞)……

======================= -v- 我是分割线==============================

楼主能写出教程来,脚本能力应该不错{/qiang}我说有类似的教程,只是不希望大家重复发明车轮浪费时间,没有其他的意思,希望楼主不要介意{/wx}。



作者: ONEWateR    时间: 2008-11-23 05:29
发布完毕
http://rpg.blue/web/htm/news1200.htm
vip += 2
作者: 雪流星    时间: 2008-11-23 21:21
没有来XP技术区都不知道.....

本来想写个简单的正则表达式教程
正好在主站上看到了这个

再看看LZ作业的答案竟然是.....我的{/dy}




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1