Project1
标题: [已解决]正则表达式的一些问题,有几个F1例子 [打印本页]
作者: miantouchi 时间: 2019-3-26 22:59
标题: [已解决]正则表达式的一些问题,有几个F1例子 本帖最后由 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"这个结果呢?
我现在是理解个字面,涉及到例子的话就对不上号了。
作者: guoxiaomi 时间: 2019-3-26 23:11
本帖最后由 guoxiaomi 于 2019-3-26 23:15 编辑
老铁,看看这个吧 https://www.jb51.net/books/22759.html
6.4.5 代码块参数
9.2.4 用正则表达式进行模式匹配
作者: RyanBern 时间: 2019-3-28 15:22
本帖最后由 RyanBern 于 2019-3-28 22:56 编辑
问题1:这是 ruby 中的代码块 ,|| 中间夹的是代码块参数 。要仔细说清楚它有点困难,不过可以就事论事。在这里
text.gsub ( pattern) { |matched| ...}
text.gsub ( pattern) { |matched| ...}
表示对 text 进行全局匹配,每当有一次成功匹配时,将匹配的部分作为代码块的参数(这里面指的是 matched)传入代码块,然后执行代码块的剩余语句,将代码块的返回值作为替换后的内容。
例如:
"abcabc" .gsub ( /ab/) { |s| s.upcase }
"abcabc" .gsub ( /ab/) { |s| s.upcase }
这里将会扫描字符串 abcabc,第一次扫描到第一个 ab,因此匹配部分为 ab,将其代入到 s 中作为参数,之后调用 s.upcase 变成大写字母,其返回值(也就是 "AB")作为替换后的内容。
当省略 matched 时,这表示这个代码块用不到匹配结束后传进来的参数。
问题2:$1,$2,$3 表示匹配成功后左起第x个圆括号 里面的实际内容,这个非常容易查。
例如:
"a123a345" .gsub ( /a( [ 0 -9 ] +) /) { "b#{$1.to_i + 100}" } # => "b223b445"
"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" 作为一个整体,例如
"0-90-9xd" .gsub ( /( 0 -9 ) +/, "taro" ) # => "taroxd"
"0-90-9xd" .gsub ( /( 0 -9 ) +/, "taro" ) # => "taroxd"
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1