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 中的代码块,|| 中间夹的是代码块参数。要仔细说清楚它有点困难,不过可以就事论事。在这里
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"





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