検索

ホームページ  >  に質問  >  本文

正则表达式 - 正则分组匹配时,使用’\n ‘与 $n 为什么不同?

例如:要将第一分组大写:
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()才起作用?

ringa_leeringa_lee2771日前1025

全員に返信(3)返信します

  • 我想大声告诉你

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

    ここには 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'.

    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'替换为aa, 再执行#upcase方法, 再替换原字串. 就我目前知道, 做不到这点, 除非ruby在语言层面提供新的语法, 否则, '1'就只是一个字串, 它对匹配组的引用并不是变量存储的过程, 猜测可能是, 在底层执行的过程, 会自动将'..'中的1替换为引用的字串.

    解答:

    • '1.upcase2', 单引号中的'1''1'分别被替换为aabb, .upcase不变.

    • '1'.upcase'1', 再与'2'连接

    • .upcase, 变量存储字串'aa'2、Ruby における単一引用符 ' と二重引用符 " の微妙な違い

    • Ruby は一般的な言語として、そのような 1 オブジェクトを持たないため、1 の代わりに '1' と書いていることにお気付きかもしれません。つまり、1 を単独で記述することはできません。
    質問 1:🎜 🎜'1' はマッチング内で使用され、$1 はマッチング外で使用されます。通常のマッチングが発生する限り、$1 は本質的にグローバル変数です。 Ruby はこれらのグローバル変数を更新します。これは主に Perl の通常の設計に基づいていますが、'1' は本質的に文字列です。マッチングするには、グループへの後方参照を使用します 🎜 🎜しかし、広い意味では、 1 は、 sedecho sed -E 's,( a {2})(b{2}),21,g'.🎜 リーリー 🎜説明: '1' は最初の一致グループ、つまり a を意味し、2 つの a を繰り返すことを意味します。 🎜ただし、1 つの特別な点は、置換を実行するときに '1' も使用できることです。🎜 🎜質問 2:🎜 🎜ほとんどの場合、'" は同じ使用法ですが、 の処理に違いがあります。二重引用符 "1"< /code> は "u0001" を意味します。つまり、1 つの文字である unicode 文字と一重引用符 '1' を入力するために使用されます。 は、1 の 2 つの文字です。'1'.upcase では 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' が格納され、大文字になります 🎜🎜 🎜

      返事
      0
  • ringa_lee

    ringa_lee2017-04-24 16:01:42

    「1」を試してください

    返事
    0
  • 天蓬老师

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

    パラメータがメソッドに渡されると、最初にパラメータが計算されてから、結果がメソッドに渡されます

    返事
    0
  • キャンセル返事