首頁  >  問答  >  主體

正規表示式 - 正規分組符合時,使用’\n ‘與 $n 為什麼不同?

例如:要將第一個分組大寫:
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()才起作用?

ringa_leeringa_lee2709 天前975

全部回覆(3)我來回復

  • 我想大声告诉你

    我想大声告诉你2017-04-24 16:01:42

    這裡涉及兩個問題:
    1, '1', 两种反向引用的区别
    2, Ruby中单引号'和双引号"$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'但在廣義上,

    .

    str =~ /(a{2})(b{2})/
      #=> 'aa'
    str =~ /(a)(b)/
      #=> 'a'
    str.sub(/(a{2})(b{2})/, '')  #=> 1abc2bbaacc3aaabbbccc4
    '1'表示匹配的第一组, 即a, 意思是重复两个a說明:

    .

    '1'但一個特殊處, 在執行替換時, 也可以使用

    .

    問題2:

    '"用法相同, 但在处理时有区别. 双引号的"1"是表示"u0001", 也就是说, 用来键入unicode字符, 是一个字符. 而单引号的'1', 就是1, 是两个字符, 如前述, 其本质是字符串, 当执行'1'.upcase时, 是对两个字符执行大写, 但Ruby中, 非小写字符的#upcase大部分情況下, '"用法相同, 但在處理時有區別. 雙引號的"1"< /code>是表示"u0001", 也就是說, 用來鍵入unicode字元, 是一個字元. 而單引號的

    , 就是1, 是兩個字元, 如前述, 其本質是字串, 當執行'1'.upcase時, 是對兩個字元執行大寫, 但Ruby中, 非小寫字元的#upcase方法回傳本身.

    '1'替换为aa, 再执行#upcase方法, 再替换原字串. 就我目前知道, 做不到这点, 除非ruby在语言层面提供新的语法, 否则, '1'就只是一个字串, 它对匹配组的引用并不是变量存储的过程, 猜测可能是, 在底层执行的过程, 会自动将'..'中的1考慮你這裡的意思, 應該是先將

    替換為aa, 再執行#upcase方法, 再替換原字符串. 就我目前知道, 做不到這一點, 除非ruby在語言層面提供新的語法, 否則,

    就只是一個字符串, 它對匹配組的引用並不是變量存儲的過程, 猜測可能是, 在底層執行的過程, 會自動將'..'中的1替換為引用的字符串.

      解答:
    • '1.upcase2', 单引号中的'1''1'分别被替换为aabb, .upcase

      '1.upcase2', 單引號中的
    • 分別被替換為aabb, .upcase< /code>不變.

      '1'.upcase'1', 再与'2'

    • '1'.upcase
    • , 再與'2'連接

      .upcase, 变量存储字串'aa'

    , 再大寫🎜🎜 🎜

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-24 16:01:42

    嘗試「1」

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-24 16:01:42

    參數傳入方法時,是先計算參數,再把結果傳入方法的

    回覆
    0
  • 取消回覆