欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ruby gsub和sub 的特殊使用

程序员文章站 2022-03-09 23:13:09
...
gsub和sub使用

常用的使用方式省略,不再描述

如果第二个参数是hash,那么匹配到的串被替换的时候,将从hash里找对应的键,如果有,则替换为键对应的值,如果没有则替换为空字符串

"fofa is best".gsub(/best/, 'a' => '1')  返回 fofa is
"fofa is best".gsub(/best/, 'best' => 'good') 返回 fofa is good

以上两种使用方式没有意义,因为完全可以把第二个参数用字符串替换,更方便,如下更有意义
"fofa is best".gsub(/[best]/, 'b' => '1', "e" => '2', "s" => 3, "t" => "4") 返回 "fofa i3 1234"

块: 匹配的内容,将被传入块中作为参数,经过运算,返回被替换的内容
"fofa is best".sub("best"){|str| str+" and good"}  返回  fofa is best and good,这个等同于如下

使用\1和\2表示匹配正则里的子串,\1表示第一个子串,\2表示第二个子串,这里需要注意的是使用\1和\2这种需要用单引号,别用双引号,双引号会转为字符,如"\101"就是8进制的65,就是A字符,  如果非要使用双引号,由于转义的原因,可以这样使用"\\1"等同于'\1'
上面的示例可以用另一种方式实现,如下
"fofa is best".sub(/(best)/, '\1 and good') 返回  fofa is best and good

基于以上内容,那么"fofa is best".sub(/best/, '\1 and good')会返回  fofa is  and good,因为\1没有匹配的子串,所以这里会是空

接下来是最重要的\+,经过测试这个代表最后一个匹配的子串,如下
"fofa is best".gsub(/(fofa) is (best)/, '*\+*')  返回 *best*
"fofa is best".sub(/best/, '\+') 返回 fofa is ,\+没有对应的匹配的子串,所以是空

问题:"a + b".gsub('+', "\\" + '+') 返回什么?
上面的表达式等于"a + b".gsub('+', "\\+") 等于 "a + b".gsub('+', '\+'),此时匹配的串里没有子串,\+就是空字符串,所以加号会被替换为空字符串,结果是a  b



总结:

\& 和 \0: 表示匹配的整个正则的内容
\1 : 第一个子串 
\2:第二个子串
\+: 最后一个子串
\\:  1个反斜杠
相关标签: ruby gsub sub