例如:要将第一分组大写:
str = '1abc2aabbcc3aaabbbccc4'
pp str.sub(/(a{2})(b{2})/, '\1.upcase\2') # =>"1abc2aa.upcasebbcc3aaabbbccc4" 第一分组怎么没有变大写呢?
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 つの問題が関係しています:
1、
'1'
と$1
、2 つの後方参照の違い'1'
和, 两种反向引用的区别
2, Ruby中单引号
'
和双引号"
的细微区别你可能注意到, 我写的是
'1'
而不是1
, 因为Ruby作为通用语言, 是不存在1
这种对象的. 换句话说, 你是不能单独写1
.问题1:
'1'
用在匹配内,用在匹配外.
本质是全局变量, 只要发生正则匹配,
Ruby
就会更新这些全局变量. 此处主要是参考Perl
的正则设计.'1'
本质是字串, 只是在匹配时, 用于组的反向引用.但在广义上,
1
的确是正规的正则反向引用, 如在sed
中使用,echo str | sed -E 's,(a{2})(b{2}),21,g'
.说明:
'1'
表示匹配的第一组, 即a
, 意思是重复两个a
.但一个特殊处, 在执行替换时, 也可以使用
'1'
.问题2:
大部分情况下,
'
和"
用法相同, 但在处理时有区别. 双引号的
"1"
是表示"u0001"
, 也就是说, 用来键入unicode
字符, 是一个字符. 而单引号的'1'
, 就是和
1
, 是两个字符, 如前述, 其本质是字符串, 当执行'1'.upcase
时, 是对两个字符执行大写, 但Ruby
中, 非小写字符的#upcase
方法返回本身.考虑你这里的意思, 应该是先将
'1'
替换为aa
, 再执行#upcase
方法, 再替换原字串. 就我目前知道, 做不到这点, 除非ruby在语言层面提供新的语法, 否则,'1'
就只是一个字串, 它对匹配组的引用并不是变量存储的过程, 猜测可能是, 在底层执行的过程, 会自动将'..'
中的1
替换为引用的字串.解答:
'1.upcase2'
, 单引号中的'1'
和'1'
分别被替换为aa
和bb
,.upcase
不变.'1'.upcase
为'1'
, 再与'2'
连接.upcase
,变量存储字串
'aa'
2、Ruby における単一引用符' code> と二重引用符
"
の微妙な違い1
オブジェクトを持たないため、1
の代わりに'1'
と書いていることにお気付きかもしれません。つまり、1
を単独で記述することはできません。'1'
はマッチング内で使用され、$1
はマッチング外で使用されます。通常のマッチングが発生する限り、$1
は本質的にグローバル変数です。Ruby
はこれらのグローバル変数を更新します。これは主にPerl
の通常の設計に基づいていますが、'1'
は本質的に文字列です。マッチングするには、グループへの後方参照を使用します 🎜 🎜しかし、広い意味では、1
は、sed
やecho sed -E 's,( a {2})(b{2}),21,g'
.🎜 リーリー 🎜説明:'1'
は最初の一致グループ、つまりa
を意味し、2 つのa
を繰り返すことを意味します。 🎜ただし、1 つの特別な点は、置換を実行するときに'1'
も使用できることです。🎜 🎜質問 2:🎜 🎜ほとんどの場合、'
と"
は同じ使用法ですが、の処理に違いがあります。二重引用符
"1" は
"u0001"
を意味します。つまり、1 つの文字であるunicode
文字と一重引用符'1' を入力するために使用されます。
は、と
1
の 2 つの文字です。'1'.upcase を実行すると、その本質は文字列になります。 code> では 2 文字を大文字にするのですが、- 🎜
Ruby
では小文字以外の#upcase
メソッド自体が返ります。🎜 🎜ここでの意味を考えると、まず'1'
をaa
に置き換えてから、#upcase
メソッドを実行してから、元のコードを置き換える必要があります。私の知る限り、これは Ruby が言語レベルで新しい構文を提供しない限り実行できません。そうでない場合、'1'
は単なる文字列であり、一致するグループへの参照は次のとおりです。推測では、最下位レベルで実行されるプロセスが、'..'
内の1
を引用符で囲まれた文字列に置き換えると考えられます。 🎜答え:🎜'1.upcase2'
、一重引用符内の'1'
、および'1'
は、それぞれaa に置き換えられます。 /code> と- 🎜
- 🎜
bb
、.upcase
は変更されません。🎜🎜'1'.upcase
は'1'
であり、'2'
と接続されています🎜🎜$1.upcase
、$1
変数には文字列'aa'
が格納され、大文字になります 🎜🎜 🎜「1」を試してください
パラメータがメソッドに渡されると、最初にパラメータが計算されてから、結果がメソッドに渡されます