6
votes

Extraire tous les caractères après la dernière occurrence d'un motif C #

Les chaînes sont du motif suivant

1.0.0.0
1.0.0.1
1.0.0.2
...
...
...


2 commentaires

Est-ce une chaîne ou une liste de chaînes?


Liste des chaînes. La dernière chaîne créée sera celle où le dernier chiffre est le plus grand.


7 Réponses :


7
votes

Vous pouvez diviser la chaîne dans les composants, analyser la dernière pour que vous puissiez l'augmenter et les mettre à nouveau ensemble:

int pos = version.LastIndexOf('.') + 1;
int num = Int32.Parse(version.Substring(pos));
version = version.Substring(0, pos) + num.ToString();


0 commentaires

2
votes
public string DoMagic(string s)
{
    string t = s.Substring(s.LastIndexOf(' ')+1);
    return t.Substring(0, t.Length-1) + (int.Parse(t[t.Length-1].ToString())+1).ToString();
}

0 commentaires

0
votes

En supposant que votre liste de chaîne est la suivante: xxx pré>

Vous pouvez obtenir la dernière entrée de cette liste à l'aide de: p> xxx pré>

puis obtenir le dernier caractère de cette chaîne utilisant: p> xxx pré>

convertissez et incrémentez le caractère en une décimale: p> xxx pré>

Enfin, copiez l'original String et remplacez le dernier numéro avec le nouveau numéro: p> xxx pré>

Ajoutez maintenant à la liste d'origine: P>

stringList.Add(finalString);


0 commentaires

0
votes

en supposant que seul le dernier élément des sous-chaînes varie:

List<string> items = GetItems();
string[] max = input.Split(' ').Max().Split('.');
string next = string.Format("{0}.{1}.{2}.{3}", max[0], max[1], max[2], int.Parse(max[3]) + 1);


0 commentaires

0
votes

J'utilise VB en ce moment, mais la traduction to c # devrait être simple. À partir de là, mettre en œuvre votre problème réel devrait être simple - vous avez une collection, le dernier élément est le dernier numéro, il suffit de l'incrémenter et de remplacer le dernier élément de la collection et de l'écrire à nouveau.

Imports System.Text.RegularExpressions

Module Module1

    Sub Main()
        Dim matchC As MatchCollection = Regex.Matches("111.222.333", "\d+")
        Dim i As Integer = 1
        For Each x In matchC
            Console.Write(i.ToString & " ")
            Console.WriteLine(x)
            i = i + 1
        Next
        ' remember to check the case where no matches occur in your real code.
        Console.WriteLine("last number is " & matchC.Item(matchC.Count - 1).ToString)
        Console.ReadLine()
    End Sub

End Module


0 commentaires

1
votes

En supposant que le format ne change pas, cela peut être votre meilleure solution. Cela fonctionnera même avec des chaînes de liste de version non commandées.

        string VersionList = "1.0.0.0 1.0.0.1 1.0.0.2";

        List<Version> Versions = new List<Version>();

        foreach (string FlatVersion in VersionList.Split(' '))
            Versions.Add(new Version(FlatVersion));

        Versions.Sort(); Versions.Reverse();

        Version MaximumVersion = Versions[0];

        Version NewVersion = new Version(
            MaximumVersion.Major, 
            MaximumVersion.MajorRevision,
            MaximumVersion.Minor,
            MaximumVersion.MinorRevision + 1);


3 commentaires

C'est une bonne solution. Si l'une des chaînes contient un point supplémentaire, ou un caractère non numérique, cela échouera. Mais si toutes les chaînes sont dans un format correct, cela fonctionnera très bien.


Je ne ferais pas de versions.Reverse (), cependant - c'est un gaspillage de CPU. Version simple Maxversion = Versions [Versions.Count - 1];


Vrai. Les deux liste (t) .Item and List (t) .Count () sont O (1). Liste.Reverse () est O (n).



6
votes

Si votre intention est de toujours obtenir la dernière sous-chaîne après un caractère spécifique (à l'exclusion du caractère de délimiteur, bien sûr (dans ce cas une période)), que je crois est votre intention:

Gardez-le simple avec une doublure : xxx

Je laisserai les autres messages répondent au reste de votre requête.


0 commentaires