[RUBY] Je comprends ça! Match le plus court

introduction

Il y a une correspondance la plus courte dans une expression régulière, mais vérifions comment l'utiliser en regardant l'opération avec quelques échantillons.

Contenu

str =" Ah ah "Ah" je "Uu" Oui "Oh" Kaka? " Si vous souhaitez extraire uniquement la partie entre parenthèses d'une telle chaîne de caractères (c'est-à-dire que vous souhaitez extraire les trois parties de "a", "u" et "oh"), vous utiliserez la correspondance la plus courte.

Avant cela, vérifions à partir d'un simple mouvement.

** + ** ne correspond pas dans cet exemple car il correspond à un ou plusieurs caractères.

str = "Ah ah """
puts str.scan(/「.+」/)
=>Ne correspond pas

*** correspond à 0 caractères ou plus, donc il correspond dans cet exemple.

str = "Ah ah """
puts str.scan(/「.*」/)
=>「」
Qu'en est-il des cas suivants?

Puisqu'il y a un caractère ** a **, il correspond.

str = "Ah ah "Ah""
puts str.scan(/「.+」/)
=>"Ah"

Cela correspond également car il y a 0 caractère ** a **. Le résultat est le même.

str = "Ah ah "Ah""
puts str.scan(/「.*」/)
=>"Ah"
Entrons un peu dans le sujet principal

Dans cet exemple, la partie entourée par ** "" qui est apparue en premier et ** " qui est apparue en dernier correspondra. Ce n'est pas ce que je veux faire.

str = "Ah ah "ah" i "uu" ouais "oh""
puts str.scan(/「.+」/)
=>"Ah" je "Uu" Oui "Oh"
Donc qu'est ce que je devrais faire

**? Si vous ajoutez **, la correspondance sera la plus courte.

str = "Ah ah "ah" i "uu" ouais "oh""
puts str.scan(/「.+?」/)
=>"A" "Uu" "Oh"

Toutes nos félicitations. : Clap clap clap ::

Et si je fais ça?

Si vous utilisez *** au lieu de ** + **, le résultat est le même, mais ...

str = "Ah ah "ah" i "uu" ouais "oh""
puts str.scan(/「.*?」/)
=>"A" "Uu" "Oh"

Selon que vous voulez faire correspondre ** "" ** ou non, vous devrez utiliser ** + ** et *** ** correctement.

Si vous ne souhaitez pas faire correspondre ** "" **, utilisez ** + **, qui correspond à un ou plusieurs caractères.

str = "Ah ah "Ah" je "Uu" Ouais "Oh" Kaka """
puts str.scan(/「.+?」/)
=>"A" "Uu" "Oh"

Si vous voulez faire correspondre ** "" **, utilisez ***, qui correspond à 0 caractère ou plus.

str = "Ah ah "Ah" je "Uu" Ouais "Oh" Kaka """
puts str.scan(/「.*?」/)
=>"A" "Uu" "Oh" ""

C'est fini :sweat_smile:

Recommended Posts

Je comprends ça! Match le plus court
J'ai vérifié ça
Je ne suis pas sûr du traitement parallèle Java