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

Project1

 找回密码
 注册会员
搜索
查看: 169|回复: 10

[已经解决] [已解决]正则表达式的一些问题,有几个F1例子

[复制链接]

[动态]受到被子君的挑战,被揍得晕头转向。 (打开TA的战斗卡片)

Lv3.寻梦者

梦石
0
星屑
3427
在线时间
517 小时
注册时间
2019-1-24
帖子
516
发表于 2019-3-26 22:59:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 miantouchi 于 2019-3-28 20:19 编辑

例子1,$1,$2,$3等等都是怎么匹配的,
我看F1解释是,分别存储着最后一次模型匹配成功时与第 n 个括号相匹配的值。若没有相应的括号时,其值为nil。
当下面写$1.to_i的时候是打印结果 1234321
当$2.to_i、$3.to_i的时候打印结果  1235321
text = "123\\c[1]321"
array = [5,4,3,2,1]
text.gsub!(/\\c\[([0-9]+)\]/){ array[$1.to_i] }
p text

例子2:
p 'abcabc'.gsub(/b/) {|s| s.upcase }    # => "aBcaBc"

例子3:
p 'abcabc'.gsub(/b/) { $&.upcase }      # => "aBcaBc"

例子4:
p 'abbbcd'.gsub(/a(b+)/) { $1 }         # => "bbbcd"

问题1:如|s|,里面||这个符号什么时候用,为什么有时候用,有时候不用,
我看F1里面,gsub(pattern) {|matched| .... }  这个模板写的|matched|,有双杠,为什么有些地方写,有些地方不写。
问题2:如例子1,$1,$2,$3等等都是怎么匹配的如例子1,我所问的问题。
问题3,$&:在当前作用域中,正则表达式最后一次匹配成功的字符串。若最后一次匹配失败,则为 nil。
我把例子3改成:p 'abcabc'.gsub(/b/) { $1.upcase } 就会报错
问题4,我如果把例子1最后面一句改成text.gsub!(/\\c\[(0-9)+\]/){ array[$1.to_i] }
p "123\e1]321"
这个问题是我看别人发的帖子问的问题,虽然是自己打错了,但是我想知道
([0,9]+) 这个是取一个或一个以上数字
(0-9)+这个是什么意思呢?换句话说如果我按照问题4那么写,怎么解读取这个正则表达式的,是怎么匹配出 p "123\e1]321"这个结果呢?

我现在是理解个字面,涉及到例子的话就对不上号了。

[动态]受到zyzzyzzyzzyz的挑战,成功击败了对方。 (打开TA的战斗卡片)

Lv4.逐梦者 (版主)

梦石
0
星屑
12101
在线时间
1436 小时
注册时间
2011-7-8
帖子
2248

开拓者

发表于 2019-3-26 23:11:31 | 显示全部楼层
本帖最后由 guoxiaomi 于 2019-3-26 23:15 编辑

老铁,看看这个吧 https://www.jb51.net/books/22759.html

6.4.5 代码块参数
9.2.4 用正则表达式进行模式匹配

点评

留着基础学完了再看这个吧,C语言学的都还给老师了。就回个C语言循环语句,哈哈。  发表于 2019-3-28 13:47
反正我当年学完C语言就开始看了,感觉还可以的  发表于 2019-3-27 15:48
下载看了,我现在的水平真是看不懂。  发表于 2019-3-27 10:59
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

[动态]向★ 心魔 ★发起了挑战,并取得了胜利。 (打开TA的战斗卡片)

Lv3.寻梦者 (版主)

梦石
0
星屑
4463
在线时间
4586 小时
注册时间
2013-6-21
帖子
3462

开拓者贵宾剧作品鉴家

发表于 2019-3-28 15:22:49 | 显示全部楼层
本帖最后由 RyanBern 于 2019-3-28 22:56 编辑

问题1:这是 ruby 中的代码块,|| 中间夹的是代码块参数。要仔细说清楚它有点困难,不过可以就事论事。在这里
RUBY 代码复制打印
  1. text.gsub(pattern){|matched| ...}

表示对 text 进行全局匹配,每当有一次成功匹配时,将匹配的部分作为代码块的参数(这里面指的是 matched)传入代码块,然后执行代码块的剩余语句,将代码块的返回值作为替换后的内容。

例如:
RUBY 代码复制打印
  1. "abcabc".gsub(/ab/){|s| s.upcase }

这里将会扫描字符串 abcabc,第一次扫描到第一个 ab,因此匹配部分为 ab,将其代入到 s 中作为参数,之后调用 s.upcase 变成大写字母,其返回值(也就是 "AB")作为替换后的内容。

当省略 matched 时,这表示这个代码块用不到匹配结束后传进来的参数。


问题2:$1,$2,$3 表示匹配成功后左起第x个圆括号里面的实际内容,这个非常容易查。

例如:
RUBY 代码复制打印
  1. "a123a345".gsub(/a([0-9]+)/) { "b#{$1.to_i + 100}"} # => "b223b445"

这里 $1 对应的就是 [0-9]+ 匹配的实际内容,分别为 "123" 和 "345"。


问题3:因为你的正则表达式里面没有括号,因此 $1 根本不会接收返回的值,为 nil,而对 nil 不能调用 upcase 方法。


问题4:这个写法一般是用不到的,这里 (0-9)+ 表示的就是原始字符 "0-9" 出现 1 次或多次。小括号的含义是将 "0-9" 作为一个整体,例如
RUBY 代码复制打印
  1. "0-90-9xd".gsub(/(0-9)+/, "taro") # => "taroxd"

点评

又研究了一会,把$1,$2,$3 表示匹配成功后左起第x个圆括号,这个刚刚弄明白。  发表于 2019-3-28 22:59
是的,手滑了  发表于 2019-3-28 22:56
实例3冒号应改成//吧。 "a123a345".gsub(/a([0-9]+)/) { "b#{$1.to_i + 100}"}  发表于 2019-3-28 22:29
可以当做学习笔记,感谢RB的详细解答  发表于 2019-3-28 21:17
  发表于 2019-3-28 20:19

评分

参与人数 2星屑 +50 +1 收起 理由
正太君 + 1 给大佬倒茶┑( ̄Д  ̄)┍
guoxiaomi + 50 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-7-23 09:07

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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