4
votes

Comment trouver des lettres doubles et les remplacer par des lettres triples?

Je n'utilise aucun langage de codage particulier, simplement un programme avec "trouver" et "remplacer" où les deux champs utilisent Regex. Par exemple, la phrase

(.)\1

se transformerait en

tooo many professsionals

Je veux "trouver" toutes les occurrences de lettres doubles, ce que je sais peut faire avec

too many professionals

Ce qui me trouble, c'est le bit "prendre la lettre doublée et la tripler". Y a-t-il un symbole dans Regex qui fait référence au "personnage actuel" ou quelque chose comme ça?

EDIT: Merci à tous pour vos suggestions. Il s'avère que le champ "remplacer" n'utilise pas, en fait, Regex, ce que l'OMI est un bullcrap, et ma question est maintenant sans valeur.


3 commentaires

Pouvez-vous nous montrer un exemple d'une entrée dont vous disposez et de la sortie que vous attendez?


La syntaxe à utiliser lors du remplacement par un groupe de capture dépend de l'implémentation. Cela peut être \ 1 , cela peut être $ 1 , ou peut-être autre chose


quelle sera la sortie souhaitée en cas de tooo ?


5 Réponses :


3
votes

Votre motif actuel (.) \ 1 qui utilise une référence arrière, est sur la bonne piste. Essayez cette recherche et remplacez:

Find:    (.)\1
Replace: $1$1$1

Démo h2 >

Cette approche correspond à n'importe quelle lettre simple suivie de la même lettre, puis remplace cette paire par trois de la même lettre.


0 commentaires

1
votes

Cela fait presque partie de votre question :).

Cela dépend également de la saveur de regex que vous utilisez.

Par exemple. pour gnu sed, c'est

$ echo 'ffoobarr' | sed -e 's/\(.\)\1/\1\1\1/g'
fffooobarrr

Donc, pour le tripler, j'ai juste utilisé \ 1 \ 1 \ 1 comme motif de remplacement. p >


0 commentaires

3
votes

L'expression de

Tim est incorrecte, car (.) fait référence à n'importe quel caractère, ce que nous ne souhaitons pas remplacer. Nous souhaitons uniquement remplacer les lettres (anglaises) ou [A-Za-z] .

La bonne façon de le faire pourrait être une expression avec un indicateur i :

const regex = /([a-z])\1/gmi;
const str = `too many   professionals
would    turn into

tooo many professsionals`;
const subst = `$1$1$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

ou peut-être une expression sans indicateur i :

([A-Za-z])\1

Démo

Test

([a-z])\1

Circuit RegEx

jex.im visualise les expressions régulières:

 entrez la description de l'image ici


0 commentaires

3
votes

Double pour tripler

Rechercher (? m) (?: ([a-zA-Z]) (?! \ 1) | ^) (([a-zA-Z]) \ 3 ) (?! \ 3)
Remplacez $ 1 $ 2 $ 3

https: // regex101. com / r / tOpl82 / 1

Expliqué

 (?m)                          # Multi-line mode     
 (?:
      ( [a-zA-Z] )                  # (1), Character behind
      (?! \1 )                      #      not a dup.
   |                              # or, 
      ^                             # BOL
 )
 (                             # (2 start)
      ( [a-zA-Z] )                  # (3), Character to dup check
      \3                            #      this is duped.
 )                             # (2 end)
 (?! \3 )                      # The dup can't be a triple


1 commentaires

Seule réponse, cela tient compte du fait que les lettres déjà triples ne devraient probablement pas être "quadruplées" et ne seront pas mises en correspondance =)



1
votes

Une autre idée en tenant compte du fait que déjà trois lettres ne devraient pas être attachées à une quatrième.

$1$3$3$3

Remplacez par:

(([A-Za-z])\2\2+)|(\w)\3

L'idée est de capturer en groupe un triplet ou plusieurs lettres | ou en groupe 3 les doubles lettres. L'un ou l'autre des groupes peut correspondre: groupe 1 ou groupe 3. En remplacement, l'un ou l'autre des groupes serait toujours vide.

Voici la démo sur regex101


0 commentaires