2017-09-05 8 views
-2

Je suis à la recherche d'un moyen facile/rapide pour identifier et extraire les hashtags d'une chaîne, et de les stocker temporairement séparément - par exemple:Trouver Extrait hashtags dans le texte

Si j'ai la chaîne suivante:

2017-08-31 Ceci est une phrase inutile utilisée comme exemple. #Example #Date: 2017-09-01 #NothingWow (et encore du texte pour faire bonne mesure).

Ensuite, je veux être en mesure d'obtenir ceci:

#Example 
#Date:2017-09-01 
#NothingWow 

je me suis dit stocker dans un TStringList devrait être suffisante jusqu'à ce que je suis fait. J'ai juste besoin de les stocker en dehors de la chaîne d'origine pour faciliter le référencement croisé, puis si la chaîne d'origine change, rajoutez-les à la fin. (mais c'est facile - la partie de son extraction, je vais avoir du mal avec)

Il devrait commencer à la fin # et/pause quand il rencontre un [espace].

La façon dont je initialement prévu était d'utiliser des drapeaux booléens (par défaut False), puis vérifier les différents hashtags, les mettre à true si trouvé, et extraire quoi que ce soit après une [:] séparément. (mais je suis sûr qu'il y a une meilleure façon de le faire)

Tout conseil sera grandement apprécié.

+2

Parse le caractère de chaîne par caractère. Lorsque vous rencontrez un '#', prenez note de la position. Lorsque vous rencontrez un espace blanc ou la fin de la chaîne, ajoutez l'étiquette de hachage à votre liste. Ensuite, s'il reste plus de cordes, continuez comme avant. –

Répondre

3

Voici une application de console simple que vous pouvez utiliser comme base pour une solution. Cela fonctionne car l'affectation de votre chaîne d'entrée à la propriété DelimitedText d'un StringList oblige le StringList à analyser l'entrée en une série de lignes limitées par des espaces. Il est alors simple de chercher ceux qui commencent par #.

Le code est écrit en tant qu'application de console Delphi mais devrait être trivial pour convertir en Lazarus/FPC.

code:

program HashTags; 

{$APPTYPE CONSOLE} 

uses 
    Classes, SysUtils; 

procedure TestHashTags; 
var 
    TL : TStringList; 
    S : String; 
    i : Integer; 
begin 
    TL := TStringList.Create; 
    try 
    S := '2017-08-31 This is a useless sentence being used as an example. #Example #Date:2017-09-01 #NothingWow (and then some more text for good measure)'; 
    TL.DelimitedText := S; 
    for i := 0 to TL.Count - 1 do begin 
    if Pos('#', TL[i]) = 1 then 
     writeln(i, ' ', TL[i]); 
    end; 
    finally 
    TL.Free; 
    end; 
    readln; 
end; 

begin 
    TestHashTags; 
end. 
+1

'TL: = TStringList.Create; Essayez ... – Sami

+0

@Sami: Merci pour spotting. C'était un peu d'édition défectueuse. – MartynA

+0

Je vois ce que vous avez fait ... J'ai juste besoin de deux _StringLists_ - le premier pour délimiter le texte, et le second pour contenir les résultats réels - merci. – Marius