12
votes

Trouvez toutes les soustractions entre deux chaînes

J'ai besoin d'obtenir toutes les substrings de la chaîne.
Pour ex:
xxx

qui renvoie 2 chaîne "AAAAAA" et "CCCCCC" Supposons que nous n'avons qu'un seul niveau de nidification. Pas sûr de Regexp, mais je pense que ce sera utile.


2 commentaires

1 Niveau de nidification signifie [Démarrer] xxx [Démarrer] aaaa [fin] zzz [fin] est possible?


Si vous faites cela pour analyser HTML ou XML, il y a de meilleures façons ...


5 Réponses :


33
votes
private IEnumerable<string> GetSubStrings(string input, string start, string end)
{
    Regex r = new Regex(Regex.Escape(start) + "(.*?)" + Regex.Escape(end));
    MatchCollection matches = r.Matches(input);
    foreach (Match match in matches)
        yield return match.Groups[1].Value;
}

0 commentaires

2
votes

Vous allez avoir besoin de mieux définir les règles qui régissent vos besoins correspondants. Lorsque vous construisez tout type de correspondance ou de code de recherche, vous devez faire une différence sur les entrées que vous prévoyez et quelles sont les sorties Vous devez produire. Il est très facile de produire du code de buggy si vous ne prenez pas ces questions en contrepartie. Cela dit ...

Vous devriez être capable d'utiliser des expressions régulières. Nidification peut le rendre légèrement plus compliqué mais toujours faisable (selon ce que vous attendez de faire correspondre dans des scénarios imbriqués). Quelque chose comme devrait vous aider à démarrer: xxx

Il doit être trivial pour envelopper le code ci-dessus dans une fonction appropriée pour vos besoins.


0 commentaires

2
votes

Vous pouvez utiliser une expression régulière, mais n'oubliez pas d'appeler REGEX.ESCAPE sur vos arguments:

public static IEnumerable<string> GetSubStrings(
   string text,
   string start,
   string end)
{
    string regex = string.Format("{0}(.*?){1}",
        Regex.Escape(start), 
        Regex.Escape(end));

    return Regex.Matches(text, regex, RegexOptions.Singleline)
        .Cast<Match>()
        .Select(match => match.Groups[1].Value);
}


0 commentaires

6
votes

Voici une solution qui n'utilise pas d'expressions régulières et ne prend pas en compte. XXX


0 commentaires

0
votes

Je m'ennuyais et j'ai donc fait un micro-repère inutile qui "prouve" (sur mon ensemble de données, qui a des chaînes jusqu'à 7k de caractères et code> étiquettes pour les paramètres de début / de fin) Ma suspicion que la solution de juhar em> est la plus rapide des trois résultats globaux.

résultats (1000000 itérations * 20 cas de test): p>

juharr: 6371ms
Jake: 6825ms
Mark Byers: 82063ms


0 commentaires