# Amélio regex (ruby)

**URL:** <https://www.debian-fr.org/t/amelio-regex-ruby/87956>\
**Category:** Programmation\
**Created:** [Mars 5, 2023, 1:44 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956 "2023-03-05T13:44:33Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![nam1962](https://www.debian-fr.org/user_avatar/www.debian-fr.org/nam1962/32/9129_2.png) [@nam1962](https://www.debian-fr.org/u/nam1962)\
**Post date:** [Mars 5, 2023, 1:44 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/1 "2023-03-05T13:44:33Z")

</div>

Hello !

Pour un exercice, je récupère des strings tous pourris genre :

```nohighlight
bout\n\n\n\n\n\n\n\n\ntruc Machin chose\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,025\n\nPatings

```

```nohighlight
bout\n\n\n\n\n\n\n\n\nBidule jaune Verdatre\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,422\n\nPatings

```

Le but est d’isoler les trois mots du milieu.

J’ai trouvé ceci `(?<=\\n)(\D*?)(?=\\n)`

Y aurait-il mieux ?

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mars 5, 2023, 11:20 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/2 "2023-03-05T23:20:17Z")

</div>

> [@nam1962](#):
>
> J’ai trouvé ceci `(?<=\\n)(\D*?)(?=\\n)`  
> Y aurait-il mieux ?

Bien que tu ne précises pas comment tu l’utilises, avec quelle commande, si tu en es satisfait, c’est sûrement très bien. Un bout de regex seul n’est pas vraiment exploitable.

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Mars 6, 2023, 11:58 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/3 "2023-03-06T11:58:06Z")

</div>

> [@Verner](#):
>
> je ne vois qu’un ‹ mot › au milieu

> [@nam1962](#):
>
> ```plaintext
> bout\n\n\n\n\n\n\n\n\ntruc Machin chose\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,025\n\nPatings
> 
> ```

Les trois mots sont « truc Machin chose ».

> [@nam1962](#):
>
> ```plaintext
> bout\n\n\n\n\n\n\n\n\nBidule jaune Verdatre\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,422\n\nPatings
> 
> ```

Et ici, « Bidule jaune Verdatre ».

---

<div class="post-metadata">

**Author:** ![nam1962](https://www.debian-fr.org/user_avatar/www.debian-fr.org/nam1962/32/9129_2.png) [@nam1962](https://www.debian-fr.org/u/nam1962)\
**Post date:** [Mars 6, 2023, 1:50 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/5 "2023-03-06T13:50:23Z")

</div>

Hello ! Merci pour votre attention 🙂

Comme indiqué dans le premier post, ce sont bien seulement les mots du milieu (ici 3, mais possiblement plus ou moins), bien cachés par des cochonneries et des sauts de ligne qui les entourent que je veux isoler.

Ils seront ensuite transformé en string cohérent en ruby (probablement avec la méthode #gsub) pour être exploités.

---

<div class="post-metadata">

**Author:** ![nam1962](https://www.debian-fr.org/user_avatar/www.debian-fr.org/nam1962/32/9129_2.png) [@nam1962](https://www.debian-fr.org/u/nam1962)\
**Post date:** [Mars 6, 2023, 4:11 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/7 "2023-03-06T16:11:49Z")

</div>

Euhh, je ne sais trop comment le dire plus clairement qu’au premier post 😕

Le but est d’isoler les groupes de mots au milieu des longues chaines comme dans les exemples.  
Les mots du début et de la fin sont exclus.  
J’avais donné deux exemples, j’en donne trois pour préciser.

```nohighlight
bout\n\n\n\n\n\n\n\n\n **truc Machin chose** \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,025\n\nPatings
bout\n\n\n\n\n\n\n\n\n **Bidule jaune Verdatre** \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,422\n\nPatings
bout\n\n\n\n\n\n\n\n\n **la cantrice Chauve aphone** \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,355\n\nPatings

```

Une fois récupérés, je pourrai les traiter comme string dans ruby pour les classer, les analyser, les retraiter, etc…

_Manifestement la source de ces chaînes de caractères est un fichier plein de sauts de lignes qui a été récupéré un peu à la sauvage, mais ce n’est pas l’objet de la réflexion : ce qui est fourni c’est ça._

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mars 6, 2023, 4:24 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/8 "2023-03-06T16:24:16Z")

</div>

On va supposer que tu as un gros souci avec les retours de ligne (_confirmé maintenant_), et que les lignes de ton fichier ne soient pas coupées en morceaux:

```auto
bout\n\n\n\n\n\n\n\n\nla cantrice Chauve aphone\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,355\n\nPatings

```

Dans cet exemple, tu voudrais extraire juste ‹&nbsp;la cantrice Chauve aphone&nbsp;›, la deuxième chaîne de mots:

```auto
$ X='bout\n\n\n\n\n\n\n\n\nla cantrice Chauve aphone\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,355\n\nPatings'
$ printf "$X" |grep . |sed -n 2p
la cantrice Chauve aphone

```

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Mars 7, 2023, 2:02 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/9 "2023-03-07T14:02:24Z")

</div>

> [@Verner](#):
>
> ```auto
> $ X='bout\n\n\n\n\n\n\n\n\nla cantrice Chauve aphone\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n1,355\n\nPatings'
> $ printf "$X" |grep . |sed -n 2p
> la cantrice Chauve aphone
> 
> ```

Ah, super, tu as compris, maintenant, je pense que le but est de faire ça avec des regex.  
@nam1962, peux-tu nous préciser avec quoi tu vas interpréter ce regex ? Dis-nous aussi s’il est très important que ça se fasse avec des regex ou si la proposition de @Verner fera l’affaire.

---

<div class="post-metadata">

**Author:** ![nam1962](https://www.debian-fr.org/user_avatar/www.debian-fr.org/nam1962/32/9129_2.png) [@nam1962](https://www.debian-fr.org/u/nam1962)\
**Post date:** [Mars 7, 2023, 2:45 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/10 "2023-03-07T14:45:19Z")

</div>

Hello !

Effectivement, il a fallu longtemps, mais le but a été compris.  
Sauf que ce n’est pas une soluce bash qui est recherchée, mais une soluce utilisable par ruby en l’occurence, (mais un autre langage aussi potentiellement).

Donc comme l’indique le titre et comme tu le rappelles, ma recherche est bien d’isoler ces mots avec juste une regex 🙂

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mars 7, 2023, 7:12 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/11 "2023-03-07T19:12:09Z")

</div>

@nam1962  
Pour ton information, quand on n’a pas un écran 32’', **toutes** les lignes que tu avais postées comme exemples, maintenant corrigées, paraissaient en fait sur **deux** lignes à l’écran.  
Impossible d’affirmer ou extrapoler si cette coupure est interne à ton fichier vérolé, ou à une difficulté à poster une longue ligne sur un forum, sans casser la ligne, ce qui explique les difficultés de formulation précise de recherche.

Pour ceux qui voudraient t’aider avec «&nbsp;ruby&nbsp;», je poste un fichier avec les lignes correctes, ce sera plus simple, plus clair et exploitable, sans contorsion.

[ftest.txt](https://www.debian-fr.org/uploads/short-url/1aFE4uUccOOZeh2bFuKSMwqfFKB.txt) (308 Octets)

En résumé, tu souhaites extraire la ‹&nbsp;deuxième chaîne de X mots séparés par des espaces&nbsp;›, de toutes les lignes d’un fichier, et qui commencent par ‹&nbsp; **bout** &nbsp;›, et se terminent par ‹&nbsp; **Patings** &nbsp;›, sans aucune ambiguïté ou autre surprise.  
Seul toi peut confirmer cette hypothèse pour garantir la **fiabilité** d’un résultat.

Tu as proposé ce regex `(?<=\\n)(\D*?)(?=\\n)` que personne n’a pu tester dans ‹&nbsp;ruby&nbsp;› pour le moment.  
Quel résultat obtiens-tu dans ruby ? Es-tu satisfait du résultat ?  
EDIT: testé, c’est pas bon du tout.  
――――――――――――――――――――――――――  
Toujours pas d’amateur de ‹&nbsp;ruby-regex&nbsp;› dans ce sujet ? Rien de surprenant, statistiquement parlant.  
Le ruby-regex est encore une autre variante de regex parmi les dizaines existantes, et est incompatible avec le regex Linux:  
• BRE - Basic Regular Expression engine (POSIX)  
• ERE - Extended Regular Expression engine.

Jongler d’une version regex exotique à une autre est plein de pièges, et c’est un exercice moyennement intéressant, voir pas du tout.

Si quelqu’un s’intéresse au ruby-regex pour aider nam1962, il peut essayer ici:  
[Rubular: a Ruby regular expression editor](https://rubular.com/)

Si au bout _d’un certain temps_, personne ne trouve, pas de panique, le bon vieux **sed** avec du vrai regex fera l’affaire pour nettoyer ce fichier.

```
$ sed 's:[^\]*\(\\n\)\+::;s:\\n.*::' ftest.txt
  Bidule jaune Verdatre
  la cantatrice chauve aphone
  truc Machin chose
  le ruby regex
  est non standard

```

Bon courage.

---

<div class="post-metadata">

**Author:** ![nam1962](https://www.debian-fr.org/user_avatar/www.debian-fr.org/nam1962/32/9129_2.png) [@nam1962](https://www.debian-fr.org/u/nam1962)\
**Post date:** [Mars 9, 2023, 12:25 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/12 "2023-03-09T12:25:26Z")

</div>

Merci pour ton attention.  
Effectivement, Rubular n’était pas content.

Étonné de voir ma question considérée comme imprécise, je l’ai posée, quasi exactement idem, sur un autre fofo de distro.  
La question n’est donc pas si obscure, car la réponse est arrivée illico :

> **[aide Regex :)](http://www.manjaro.fr/forum/viewtopic.php?p=146745&sid=0b4e62fe7659f4abc3118c098274f631#p146745)**
>
> bonjour Pour le motif de fin, seul \\ suffit, pas besoin de \\n Avec ta regex, je trouve quelques \\n sur les 56 résultats si je remplace \\D par a-zA-Z , plus que 30 résultats , re

```auto
(?<=\\n)([a-zA-Z]+?)(?=\\)

```

Fait donc bien le boulot en absolu comme en relatif 😉

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mars 9, 2023, 9:22 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/13 "2023-03-09T21:22:51Z")

</div>

Sur le forum manjaro, la balise code ne tronçonne pas les lignes en fonction de la largeur de l’écran contrairement à ici, causant l’incohérence entre la demande et les lignes supposées extraites d’un fichier vérolé. Pour ne pas couper les lignes ici, la balise code ne suffit pas, il faut placer le texte entre «&nbsp;```&nbsp;»

```auto
 >> ---- début de longue ligne sans troncature >>----------------------------------------------------------------------fin <<

```

80% des messages de ce forum sont ré-édités pour ce genre de problème.

Grep comprend **trois** types de regex: BRE (par défaut) + ERE (étendu /-E) et Perl (-P).  
Le **regex Perl** de grep comprend les deux syntaxes:

```auto
X='bout\n\n\ntruc Machin chose\n\n\n\n1,025\n\nPatings'

$ echo "$X" |grep -Po '(?<=\\n)(\D*?)(?=\\n)'
  truc Machin chose

$ echo "$X" |grep -Po '(?<=\\n)([a-zA-Z]+?)(?=\\)'
  truc Machin chose

```

**Kate** interprète aussi correctement les deux syntaxes:

![ksnip_20230309-213735-1](https://www.debian-fr.org/uploads/default/original/2X/4/4e72804122cafb9c5f4cc37f15d7b472be2a278c.jpeg)

![ksnip_20230309-213932-2](https://www.debian-fr.org/uploads/default/original/2X/9/9b53a6641b357ce697c425d6a855cae37db5983a.jpeg)

J’ai constaté que certaines syntaxes regex extrêmement simples ne fonctionnent pas pour du regex ruby: pas compris.  
Il ne faut pas chercher de logique à ce regex exotique, mais le bon réflexe est effectivement de se rapprocher au maximum d’un regex **POSIX** , d’un dénominateur commun de dizaines de regex qui traînent dans la nature.  
On va dire que ce sont les mystères des regex exotiques, d’où l’importance de toujours préciser le type précis de regex recherché, dès le premier message (le titre du sujet a été corrigé en conséquence), quand ce n’est pas du regex linux, qu’il soit BRE, ERE ou Perl.

---

<div class="post-metadata">

**Author:** ![nam1962](https://www.debian-fr.org/user_avatar/www.debian-fr.org/nam1962/32/9129_2.png) [@nam1962](https://www.debian-fr.org/u/nam1962)\
**Post date:** [Mars 10, 2023, 2:46 UTC](https://www.debian-fr.org/t/amelio-regex-ruby/87956/14 "2023-03-10T14:46:19Z")

</div>

Merci pour cet éclairage.

C’est vrai que c’est ballot, j’avais uniquement mis un backtick au lieu de trois et en plus, sur mon écran, tout apparaît correct !

Le diable se cache dans les détails !

Pour Ruby, c’est très intéressant pour moi : décrassage (j’étais resté… au basic !) et apprentissage de pas mal de principes.
