例如:要將第一個分組大寫:
str = '1abc2aabbcc3aaabbbccc4'
pp str.sub(/(a{2})(b{2})/, '1.upcase2') # =>"1abc2aa.upcasebbcc " 第一分組怎麼沒有變大寫呢?
pp str.sub(/(a{2})(b{2})/, '1'.upcase + '2') # =>"1abc2aabbcc3aaabbbccc4" 奇怪,upcase()還是沒作用!?
pp str.sub(/(a{2})(b{2})/, $1.upcase + '2') # =>"1abc2AAbbcc3aaabbbccc4" 使用$1而不是'1',upcase()才起作用?
這裡涉及兩個問題:
2, Ruby中單引號1,
'1'
和, 两种反向引用的区别
2, Ruby中单引号
'
和双引号"
和$1
, 兩種反向引用的區別'
和雙引號"
的細微差別'1'
而不是1
, 因为Ruby作为通用语言, 是不存在1
这种对象的. 换句话说, 你是不能单独写1
你可能注意到, 我寫的是'1'
用在匹配内,用在匹配外.
本质是全局变量, 只要发生正则匹配,
Ruby
就会更新这些全局变量. 此处主要是参考Perl
的正则设计.'1'
1
的确是正规的正则反向引用, 如在sed
中使用,echo str | sed -E 's,(a{2})(b{2}),21,g'
但在廣義上,'1'
表示匹配的第一组, 即a
, 意思是重复两个a
說明: .'1'
但一個特殊處, 在執行替換時, 也可以使用'
和"
用法相同, 但在处理时有区别. 双引号的
"1"
是表示"u0001"
, 也就是说, 用来键入unicode
字符, 是一个字符. 而单引号的'1'
, 就是和
1
, 是两个字符, 如前述, 其本质是字符串, 当执行'1'.upcase
时, 是对两个字符执行大写, 但Ruby
中, 非小写字符的#upcase
大部分情況下,'
和"
用法相同, 但在處理時有區別. 雙引號的
"1"是表示
"u0001"
, 也就是說, 用來鍵入unicode
字元, 是一個字元. 而單引號的和
1
, 是兩個字元, 如前述, 其本質是字串, 當執行'1'.upcase
時, 是對兩個字元執行大寫, 但Ruby
中, 非小寫字元的#upcase
方法回傳本身.'1'
替换为aa
, 再执行#upcase
方法, 再替换原字串. 就我目前知道, 做不到这点, 除非ruby在语言层面提供新的语法, 否则,'1'
就只是一个字串, 它对匹配组的引用并不是变量存储的过程, 猜测可能是, 在底层执行的过程, 会自动将'..'
中的1
考慮你這裡的意思, 應該是先將aa
, 再執行#upcase
方法, 再替換原字符串. 就我目前知道, 做不到這一點, 除非ruby在語言層面提供新的語法, 否則,就只是一個字符串, 它對匹配組的引用並不是變量存儲的過程, 猜測可能是, 在底層執行的過程, 會自動將
'..'
中的1
替換為引用的字符串.解答:-
和- 分別被替換為
- , 再與
, 再大寫🎜🎜 🎜'1.upcase2'
, 单引号中的'1'
和'1'
分别被替换为aa
和bb
,.upcase
'1.upcase2'
, 單引號中的aa
和bb
,.upcase不變.
'1'.upcase
为'1'
, 再与'2'
'1'.upcase
為'2'
連接.upcase
,变量存储字串
'aa'
嘗試「1」
參數傳入方法時,是先計算參數,再把結果傳入方法的