web-dev-qa-db-fra.com

Comment extraire les hashtags sociaux d'une cellule?

Exemple:

A2 -> What a beautiful day! #sunday #summer
B3 -> #news Stay tuned for our next contest! #something

Desired output on B2 ->#sunday #summer
Desired output on B3 ->#news #something

Le plus proche que j'ai trouvé est REGEXEXTRACT mais il ne livre que le premier mot qui commence par un #:

=REGEXEXTRACT(A2;"#[A-z0-9]+")
3
Renan

Bien que regexextractpuisse renvoyer un tablea , vous devez savoir combien il en existe, ce qui n'est donc pas utile dans votre cas. Pour contourner cette limitation de regexextract, vous devez utiliser regexreplace pour vous débarrasser du texte que vous ne voulez pas . Comme ça:

=trim(regexreplace(A2, "(^|\s)[^#]\S*", ""))

L'expression régulière correspond aux mots ne commençant pas par # et les remplace par une chaîne vide. La fonction de rognage nettoie les espaces supplémentaires possibles.

Mieux couper

Ce qui précède fonctionne bien pour vos exemples, mais présente des défauts dans des situations plus complexes:

Breaking #news-in just now! A new photo #contest! Code name #as_shot (important underscore here). #something. 

La commande ci-dessus retourne

#news-in #contest! #as_shot #something. 

ne réalisant pas que les hashtags ne peuvent pas inclure -!. (ils sont limités aux "caractères Word", A-Za-z0-9_). Donc, un autre regexreplace est nécessaire pour nettoyer. Je mets les deux dans une commande: une telle imbrication de regexreplace est assez commune.

=regexreplace(trim(regexreplace(A2, "(^|\s)[^#]\S*","")), "[^#\w\s]\S*", "") 

Le remplacement externe supprime les parties des hashtags du premier caractère qui n'est ni \w ni # jusqu'à la fin. La sortie a des hashtags corrects:

#news #contest #as_shot #something

Simplification

Il semble que les deux commandes regexreplace puissent être combinées en une seule en lui donnant les deux expressions rationnelles ci-dessus comme alternatives. La logique de cette expression rationnelle combinée est plus difficile à suivre, mais cela a fonctionné dans tous les exemples que j'ai essayés.

=trim(regexreplace(A2, "((^|\s)[^#]\S*)|([^#\w\s]\S*)", ""))
6
user79865

L’autre alternative est de combiner split, join, repeat avec un extrait de regex comme ceci:

=join(" ",REGEXEXTRACT(A1,rept(".*(#\w+\S?\w+)",counta(split(A1,"#"))-1)))

il divise essentiellement le texte par #, puis répète la regex générique pour le capturer autant de fois que vous le souhaitez (-1 pour la cellule supplémentaire émise lorsque vous utilisez split). - Il est également possible d'inclure le caractère occasionnellement supplémentaire que vous pouvez rencontrer. à travers comme un - ou _ avec le\S?

enter image description here

1
Aurielle Perlmann