J'ai une chaîne comme "ABCD232ERE44RR". Comment puis-je le diviser en segments séparés par des lettres / chiffres. J'ai besoin de: Segment1: ABCD Segment2: 232 Segment3: ERE Segment4: 44

Il peut y avoir n'importe quel nombre de segments. Je pense aller Regex mais je ne comprends pas comment l'écrire correctement

c#
2
anjulis 15 nov. 2017 à 22:03

4 réponses

Meilleure réponse

Vous pouvez le faire comme ça;

using System;
using System.Collections.Generic;   
using System.Text.RegularExpressions;
public class Program
{
    public static void Main()
    {
        var substrings = Regex.Split("ABCD232ERE44RR", @"[^A-Z0-9]+|(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])");
        Console.WriteLine(string.Join(",",substrings));
    }
}

Output : ABCD,232,ERE,44,RR
2
lucky 15 nov. 2017 à 19:16

Si vous décidez de ne pas utiliser regex, vous pouvez toujours suivre la voie manuelle.

const string str = "ABCD232ERE44RR1SGGSG3333GSDGSDG";

var result = new List<StringBuilder> 
{
    new StringBuilder()
};

char last = str[0];

result.Last().Append(last);

bool isLastNum = Char.IsNumber(last);

for (int i = 1; i < str.Length; i++)
{
    char ch = str[i];

    if (!((Char.IsDigit(ch) && isLastNum) || (Char.IsLetter(ch) && !isLastNum)))
    {
        result.Add(new StringBuilder());
    }

    result.Last().Append(ch);
    last = ch;
    isLastNum = Char.IsDigit(ch);
}
0
Nikola.Lukovic 15 nov. 2017 à 19:53

Essayez quelque chose comme:

((A-Z)+(\d)*)+
1
Pablo Santa Cruz 15 nov. 2017 à 19:06

Je suggère de penser à cela comme à la recherche de correspondances avec un motif cible plutôt que de le diviser en parties que vous voulez. La division donne une signification aux délimiteurs tandis que la correspondance donne une signification aux jetons.

Vous pouvez utiliser Regex.Matches:

Recherche dans la chaîne d'entrée spécifiée toutes les occurrences d'une expression régulière spécifiée.

var matches = Regex.Matches("ABCD232ERE44RR", "[A-Z]+|[0-9]+");

foreach (Match match in matches) {
     Console.WriteLine("Found '{0}' at position {1}", match.Value, match.Index);
}
2
allonhadaya 15 nov. 2017 à 19:19
47315324