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

Project1

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

[已经解决] 一个关于正规表示的问题

[复制链接]

Lv2.观梦者

梦石
0
星屑
723
在线时间
530 小时
注册时间
2010-6-9
帖子
840
跳转到指定楼层
1
发表于 2010-7-7 02:24:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 提妲 于 2010-7-8 08:43 编辑
  1. module KGC::SlipDamageExtension
  2.   # 正規表現
  3.   module Regexp
  4.     # ステート
  5.     module State
  6.       # スリップダメージ
  7. [code]      SLIP_DAMAGE = /<(?:SLIP|スリップ)\s*([HM]P)?\s*([\-\+]?\d+)([%%])?
  8.         (?:\s*,\s*([\-\+]?\d+))?\s*>/ix
复制代码
end
  end
end
[/code]
以上代码是一个脚本的正规表现...?是不?其中
  1.       SLIP_DAMAGE = /<(?:SLIP|スリップ)\s*([HM]P)?\s*([\-\+]?\d+)([%%])?
  2.         (?:\s*,\s*([\-\+]?\d+))?\s*>/ix
复制代码
应该是在注释里面添加的内容,但我等不明符号,若各位看官明其所指,望授之以渔,好让吾等效仿...

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2010-7-7 04:50:56 | 只看该作者
这个内地翻译是正则表达式,一种可以用来描述所有正则语言的表达式

在 Ruby 中,正则表达式字面值是以正斜杠开始和结尾的,表达式内容是  / ... / 中间被包围的部分,再在末尾附上可能的正则表达式选项(下面会讲解)

首先在纯正则表达式中,相邻的两个元字符之间如果没有任何东西,那么默认是进行了串联运算 '·',比如 a · b = ab,表示接收元字符 a 紧接着元字符 b

(?:SLIP|スリップ)
这个部分是用了纯正则表达式中的交替运算符 '|',也就是一条竖线,表示下面的字串可以有两条匹配路径,一个是 SLIP,另一个是 スリップ,出现两者任意的一个,正则表达式都会接受这部分分字串。由于 | 的优先级很低,为了只运算 SLIP | スリップ ,就需要用括号来指明运算顺序。

在扩展正则表达式中,单纯的括号中被匹配的内容是会被用作反向引用的,\1, \2, ..., \n 分别是反向引用第 1、2、...、n 个括号中被匹配的内容(按出现顺序排列),表示在这个地方匹配之前第 n 个括号中已经被匹配的内容(这个特性其实已经让扩展正则表达式匹配了非正则的语言)。Ruby 同时还会把括号中匹配的内容分别保存到 $1、$2、...、$n 这些全局变量中,以便在正则表达式外部引用。然而有时我们并不希望把当前括号中的内容用作反向引用,那么就可以使用 (?: ) 的语法,表示 (?: ... ) 中匹配的内容不会保存到 \n 或者 $n 中

\s*
这个则是用到了纯正则表达式中第二个运算符:重复运算符,表示指定模式的字串可以出现 0 - n 次。\s 则是一种通配符,匹配所有“空白字符”,包括空格符、回车符、换行符、水平制表符、垂直制表符和换页符。\s* 就是接收字串出现 0 次或多次的这些空白字符

([HM]P)?
这个部分中的 [ ] 是用来表示一个字符集的,出现在 [ ] 中的元字符都被认为是可接受的,等同于在每个元字符间进行 | 替换运算。[HM] 就是接受 H 和 M 这两个字母中的一个,然后串联上 P。在外层的括号指定了运算优先级,同时也被作为了反向引用(\1)。 ? 则是扩展正则表达式中的运算符,用来表示“可选”,即接收出现 0 次或者 1 次的指定模式字串。这里由于前面的括号会先运算,所有 ? 运算符是应用在了整个 [HM]P 上,也就是可以出现 0 个或者 1 个 HP 或者 MP

\s*
同上

([\-\+]?\d+)
这个部分,\d 是另一个通配符,匹配所有数字字符,等同于 [0-9] = [0123456789] = 0|1|2|3|4|5|6|7|8|9。+ 是扩展正则表达式中的常用运算符,表示指定模式的字串出现 1 次以上。[\-\+] 表示匹配 - 或者 + 这两个符号,他在这里用的是转义字符 \- 和 \+,表示让这两个字符作为元字符,而不是用来表示范围的 - 和表示重复出现一次以上的 + 运算符。实际上这里没有必要转义 +,因为在字符集 [] 内部 + 会自动被当做元字符。 ? 运算符再一次被运用,表示接收出现 0 次或 1 次的 + 或 -。所以这个部分整个匹配的实际上就是一个整数字面值,有或者没有的 +/- 代表整数的符号,紧接着一个以上的 \d 代表任何十进制数位。注意这里又产生了第二个反向引用 \2

([%%])?
基本的语法已经解释过,这个部分匹配的是可选的 % 或者 %,即出现或者不出现半角或全角的百分号都可以接受。这里产生反向引用 \3

(?:\s*,\s*([\-\+]?\d+))?
基本的语法已经解释过,这个部分匹配的是可能出现的一串空白符,跟着一个逗号,跟着可能出现的一串空白符,跟着一个可能出现的 + 或者 -,跟着长度大于 0 的一串 10 进制数位。整体接受的字串就是可能被空白符分隔的逗号,跟着一个整数字面值

\s*
同上

至此上面的正则表达式的内容就结束了,但在 / 的后面,还有两个字符 i x,这就是之前说的正则表达式的选项。i 表示匹配时大小写不敏感,x 表示正则表达式中出现的空白字符会被忽视(换句话说就是可以缩进,可以换行),同时可以在正则表达式中添加以 # 开头的注释

总结,这个表达式匹配字串的是:
日文或者英文的 "slip" 这个单词,跟着可能的空白,跟着可能的 "HP" 或者 "MP",跟着一个整数字面值,跟着一个可能的全角或半角百分号,跟着可能的空白、逗号、空白、整数字面值组合,最后再跟上可能的空白

点评

若有所湿 确有所得  发表于 2010-7-7 21:48

评分

参与人数 4星屑 +896 收起 理由
提妲 + 798 认可答案
小幽的马甲 + 80 普及正则人人有责
水镜风生 + 12 我也湿了……
wangswz + 6 神啊 看的我湿了

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
416 小时
注册时间
2006-10-21
帖子
1245
3
发表于 2010-7-7 10:27:13 | 只看该作者
我也用的 スリップダメージ拡張 持续回复伤害特效扩张
状态 备注 <持续回复伤害 HP 3%, 3>
这就是 每回合 3%回复 每步回复3点HP 可以改成MP 后面数值负数 为伤害
持续回复伤害 替换 /<(?:SLIP|スリップ) 的スリップ

点评

状态 备注 这就是 每回合 3%回复 每步回复3点HP 可以改成MP 后面数值负数 为伤害 持续回复伤害 【替换 /  发表于 2010-7-7 21:55
状态 备注 这就是 每回合 3%回复 每步回复3点HP 可以改成MP 后面数值负数 为伤害 持续回复伤害 【替换 /  发表于 2010-7-7 21:54
状态 备注 这就是 每回合 3%回复 每步回复3点HP 可以改成MP 后面数值负数 为伤害 持续回复伤害 【替换 /  发表于 2010-7-7 21:52
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
723
在线时间
530 小时
注册时间
2010-6-9
帖子
840
4
 楼主| 发表于 2010-7-7 21:50:20 | 只看该作者
谢谢各位 请斑竹认可2L 当然 3L是授之以鱼 领教...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-9 02:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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