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个反斜杠
常用的使用方式省略,不再描述
如果第二个参数是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个反斜杠