赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
这个内地翻译是正则表达式,一种可以用来描述所有正则语言的表达式
在 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",跟着一个整数字面值,跟着一个可能的全角或半角百分号,跟着可能的空白、逗号、空白、整数字面值组合,最后再跟上可能的空白 |
评分
-
查看全部评分
|