2013-09-23 4 views
-4

Je voudrais qu'une expression régulière corresponde aux 4 premiers caractères d'une chaîne dans .NET. Pour être plus précis, j'utilise la méthode substring pour rechercher la 1ère occurrence d'un morceau de chaîne et les 4 caractères qui le précèdent.Correspondance de sous-chaîne utilisant l'expression régulière

Disons que j'ai une chaîne comme ceci:

..Dans mon code, ce que je fais

string s = "adgstuoppdnmudio hjdk.ABCD kglog doplsjood" 
string x = s.Substring(s.IndexOf("ABCD")) 

... C'est ce que je reçois, x = "adgstuoppdnmudio hjdk.ABCD" ce que je suis à la recherche car est comment obtenir les 5 caractères avant ABCD dans la chaîne ci-dessus (hjdk.) de sorte que ma chaîne finale est "hjdk.ABCD". Je pourrais probablement utiliser un char Array puis la fonction inverse qui va avec pour que je puisse lire ma chaîne vers l'arrière mais je crois qu'une regex fonctionnera plus vite donc dans mon titre de question j'ai souligné 'using regular expression'.

+1

Votre question n'est pas claire. Pouvez-vous le reformuler? – Kami

+0

Publiez du code que vous voulez dans votre résultat. –

+0

Ok..let disons que j'ai une chaîne comme cette chaîne s = "adgstuoppdnmudio hjdk.ABCD kglog doplsjood" .. Dans mon code, c'est ce que je fais string x = s.Substring (s.IndexOf ("ABCD")) ... C'est ce que je reçois, x = "adgstuoppdnmudio hjdk.ABCD" ce que je cherche est comment obtenir les 5 caractères avant ABCD dans la chaîne ci-dessus (hjdk.) De sorte que ma chaîne finale est "hjdk.ABCD ". J'espère que c'est plus clair maintenant. Merci –

Répondre

0

Votre question n'est pas très claire mais peut-être que vous avez besoin de quelque chose comme ci-dessous.

string text = "abcdefghijklmn"; 

string myString = (text.Length > 3)? text.Substring(text.Length - 4, 4): text; 
0
string text = "asdf"; 

(?<=asdf)\w+$ 

Cela Associez les mots après "asdf" jusqu'à la fin de la ligne. Vous devrez peut-être changer la fin de la ligne en fonction de vos besoins.

0
.{4}asdf 

Correspondra à asdf et aux quatre caractères précédents. Il ne correspondra pas à asdf dans le cadre des 3 premiers caractères d'un mot.

Il pourrait être préférable pour vous d'utiliser

.{0,4}asdf 

Mais cela dépend de la façon dont vous voulez cas de pointe à se comporter.

String  |First match of .{4}asdf |First match of .{0,4}asdf 
123asdf  | *No match*    | 123asdf 
12345asdf | 2345asdf    | 2345asdf 
asdfasdf | asdfasdf    | asdfasdf 
123asdfasdf | asdfasdf    | 123asdf 

Les solutions basées sur la sous-chaîne sont plus rapides que les solutions basées sur l'expression rationnelle.

0

J'ai trouvé une solution qui fonctionne aussi et a décidé de le partager avec le reste du forum. Merci d'avoir aidé. C'est ce que j'ai fait:

string s = "adgstuoppdnmudio hjdk.ABCD kglog doplsjood";

chaîne x = s.Substring (0, s.IndexOf ("ABCD"));

// Cela me donne x = "adgstuoppdnmudio hjdk". Ensuite, je fais ci-dessous pour obtenir les 5 derniers caractères

chaîne lastChars = x.Substring (x.Length-Math.Min (5, x.Length));

// Cela me donne lastChars = "hjdk".

+0

Il est vrai que (contrairement à ce que suggérait ma question) cette solution n'utilise pas d'expression régulière mais j'ai décidé de l'afficher de toute façon juste au cas où il y aurait des gens qui me ressemblent un peu avec des expressions régulières –

1

Ce n'est pas un RegEx mais si vous utilisez déjà C#, vous pouvez ajouter une méthode ExtensionMethod à String pour le faire pour vous.

public static class StringExtensions 
{ 
    public static string Preceeds(this string s, string word) 
    { 
     string response = s; 

     int pos2 = s.IndexOf(word); 
     int pos1 = s.Substring(0, pos2).LastIndexOf(" "); 

     if (pos1 != -1 && pos2 != -1 && (pos2 >= pos1)) 
     { 
      response = s.Substring(pos1, pos2 - pos1 + word.Length); 
     } 

     return response; 
    } 
} 

Ensuite, vous pouvez le faire.

x = s.Preceeds("ABCD"); 
Questions connexes