2010-03-29 16 views
3

Tout d'abord, j'ai fait une recherche sur ceci et j'ai pu trouver comment utiliser quelque chose comme String.Split() pour extraire la chaîne en fonction d'une condition. Cependant, je n'ai pas pu trouver comment l'extraire en fonction d'une condition de fin. Par exemple, j'ai un fichier avec des liens vers des images: http://i594.photobucket.com/albums/tt27/34/444.jpghttp://i594.photobucket.com/albums/as/asfd/ghjk6.jpg Vous remarquerez que toutes les images commencent par http:// et se terminent par .jpg. Cependant, .jpg est remplacé par http: // sans espace, ce qui rend un peu plus difficile.Extraire une chaîne commençant par x et se terminant par y

Donc, fondamentalement, je suis en train de trouver un moyen (Regex?) Pour extraire une chaîne à partir d'une chaîne qui commence par http: // et se termine par .jpg

+0

ce qu'il y aura seulement les caractères [a-z], [A-Z] et [. /] Ou vous également attendez d'autres symboles? Et oui, Regex résoudrait ça. – wheaties

+0

Depuis ce sont des liens vers des images, je suppose que presque tout se passe. Des chiffres à coup sûr, peut-être -. – DMan

Répondre

4

Regex est la meilleure façon de le faire. Si vous n'êtes pas familier avec les expressions régulières, vous pouvez consulter Regex Buddy. C'est un petit outil relativement bon marché que j'ai trouvé extrêmement utile quand j'apprenais. Pour votre cas particulier, une expression possible est:

(http://.+?\.jpg) 

Il faut sans doute un peu plus de raffinement, car il y a des cas limites qui pourraient faire trébucher ce, mais cela fonctionnerait si le fichier est une simple liste.


Vous pouvez également effectuer un test rapide gratuit des expressions here.


par votre dernier commentaire, si vous avez des liens vers d'autres non-images aussi bien, alors vous devez vous assurer qu'il ne démarre pas au http: // pour un lien et lisez tout le chemin à le .jpg pour l'image suivante. Étant donné que les URL ne sont pas autorisés à avoir des espaces, vous pouvez le faire comme ceci:

(http://[^\s]+\.jpg) 

Cela dit essentiellement, « une suite de caractères commençant par http: // et se terminant par .jpg où il y a au moins un caractère entre les deux et aucun de ces caractères sont des espaces ".

+0

+1 pour Regex Buddy - C'est de là que j'ai généré le C# dans mon post! –

+0

Je suis d'accord qu'en général le genre de problème est assez facile à résoudre avec regex - et probablement l'approche préférée. Mais son cas spécifique, une simple scission sur .jpg est toujours le moyen le plus simple de le résoudre. –

+1

@Wagner, cela dépend du format réel du fichier. Si c'est vraiment une simple liste sans délimiteur ni autre texte, alors je suis d'accord, scinder sur .jpg est plus simple, mais aussi plus fragile. Je préférerais Regex même pour le cas le plus simple pour sa flexibilité si les exigences changent. –

1

Dans votre cas spécifique, vous pouvez toujours diviser si ".jpg". Vous finirez probablement avec un élément vide à la fin du tableau, et vous devrez ajouter le .jpg à la fin de chaque fichier si vous en avez besoin. En dehors de cela, je pense que cela fonctionnerait.

Testés le code suivant et il a bien fonctionné:

public void SplitTest() 
{ 
    string test = "http://i594.photobucket.com/albums/tt27/34/444.jpghttp://i594.photobucket.com/albums/as/asfd/ghjk6.jpg"; 
    string[] items = test.Split(new string[] { ".jpg" }, StringSplitOptions.RemoveEmptyEntries); 
} 

Il a même se débarrasser de l'entrée vide ...

+0

Cela fonctionne très bien pour l'exemple donné. Cependant, il n'appliquera pas correctement l'exigence "http" de départ. Par exemple, ajoutez "foobar.jpg" quelque part dans l'entrée et "foobar" est dans le résultat 'items'. C'est facile à résoudre en ajoutant un '.Where (s => s.StartsWith (" http "))' après le 'Split'. –

2
Regex RegexObj = new Regex("http://.+?\\.jpg"); 
Match MatchResults = RegexObj.Match(subject); 
while (MatchResults.Success) { 
    //Do something with it 
    MatchResults = MatchResults.NextMatch(); 
    } 
+0

Vous avez certainement besoin du + comme Dan a, sinon vous ne trouverez qu'un nom de fichier de zéro ou un caractère. –

+0

Merci pour la réponse. Cela n'a pas fonctionné cependant. Je pense que c'est parce que vous avez oublié le signe + comme trouvé dans la réponse de Dan (ainsi que deux \\). – DMan

+0

@Ben - Good Catch, @DMan - Cela est nécessaire pour échapper les chaînes \ in C#. Vous pouvez éviter le besoin de le faire en mettant le motif dans un littéral de chaîne préfixé par le symbole @ –

1

Le LINQ suivant se sépare par http: et veillez à obtenir uniquement les valeurs qui se terminent par jpg.

var images = from i in imageList.Split(new[] {"http:"}, 
            StringSplitOptions.RemoveEmptyEntries) 
       where i.EndsWith(".jpg") 
       select "http:" + i; 
Questions connexes