Maison  >  Questions et réponses  >  le corps du texte

正则表达式 - 正则分组匹配时,使用’\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_lee2709 Il y a quelques jours974

répondre à tous(3)je répondrai

  • 我想大声告诉你

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

    Deux problèmes sont impliqués ici :
    1, '1' et , la différence entre les deux références arrière
    2, la différence subtile entre les guillemets simples ' et les guillemets doubles " dans Rubis

    Vous remarquerez peut-être que j'ai écrit '1' au lieu de 1, car Ruby, en tant que langage général, n'a pas d'objet tel que 1 En d'autres termes, vous ne pouvez pas écrire 1 seul .

    Question 1 :

    '1' est utilisé dans la correspondance, est utilisé en dehors de la correspondance. est essentiellement une variable globale. Tant qu'une correspondance régulière se produit, Ruby mettra à jour ces variables globales. to Perl Conception régulière '1' est essentiellement une chaîne, mais est utilisée comme référence arrière pour le groupe lors de la correspondance

    .

    Mais au sens large, 1 est en effet une référence arrière régulière, telle que celle utilisée dans 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

    Explication : '1' représente le premier groupe de matchs, c'est-à-dire a, ce qui signifie en répéter deux a.

    Mais un point particulier est que lors du remplacement, vous pouvez également utiliser '1'.

    Question 2 :

    Dans la plupart des cas, ' et " sont utilisés de la même manière, mais il existe des différences dans le traitement Les guillemets doubles "1" représentent "u0001", c'est-à-dire utilisés pour taper unicode. Le caractère est un caractère. Le '1' entre guillemets simples est et 1, qui sont deux caractères. Comme mentionné ci-dessus, son essence est une chaîne lors de l'exécution de '1'.upcase, il est exécuté sur les deux caractères. . Majuscules, mais en Ruby, la méthode #upcase pour les caractères non minuscules se renvoie d'elle-même.

    Compte tenu de ce que vous voulez dire ici, vous devez d'abord remplacer '1' par aa, puis exécuter la méthode #upcase, puis remplacer la chaîne d'origine. Pour autant que je sache, cela ne peut être fait que si Ruby ​​​​est utilisé. est dans le langage Fournissez une nouvelle syntaxe au niveau, sinon '1' n'est qu'une chaîne et sa référence au groupe correspondant n'est pas un processus stocké dans une variable. On suppose que le processus exécuté en bas changera automatiquement. le '..' dans 1 > Remplacé par une chaîne entre guillemets.

    Réponse :

    • '1.upcase2', '1' et '1' entre guillemets simples sont remplacés respectivement par aa et bb, .upcase reste inchangé.

    • est

      , puis connectez '1'.upcase'1' avec '2'

    • ,

      Chaîne de stockage variable .upcase, puis mettre en majuscule 'aa'

      répondre
      0
  • ringa_lee

    ringa_lee2017-04-24 16:01:42

    essayez "1"

    répondre
    0
  • 天蓬老师

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

    Lorsque des paramètres sont transmis à une méthode, les paramètres sont calculés en premier, puis les résultats sont transmis à la méthode

    répondre
    0
  • Annulerrépondre