2016-01-11 1 views
1

J'ai une chaîne qui est dans un format comme « C 01 ABC 02 AB »découpant une chaîne et de le remettre ensemble

Je vais partager avec

string[] line = String.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

et il fonctionne comme un charme.

Mais j'ai besoin de le remettre dans un format différent.

J'ai besoin d'abord C puis "01 ABC 02" puis enfin AB séparément.

Fondamentalement, j'ai besoin de changer "C 01 ABC 02 AB" en trois plus petites chaînes comme "C" "01 ABC 02" et "AB". Malheureusement, ABC et 02 parties peuvent changer de longueur à Je ne peux pas assigner une variable fixe pour faire le fractionnement.

J'ai essayé string.Join mais n'a pas fonctionné comme je le voulais.

On dirait que tous les autres exemples joignent le tableau entier en une seule chaîne, comment puis-je faire cela?

+2

Pouvez-vous faire quelque chose comme 'str1 = ligne [0]; str2 = ligne [1] + ligne [2] + ligne [3]; str3 = ligne [4];' ou il y a quelque chose que je ne fais pas ONU Derstand dans votre question? – Pikoh

+0

est C et AB de longueur fixe? –

+0

Il y a quelques possibilités, mais vous n'avez pas précisé ce qui définit ces "parties". Comment saurez-vous quoi séparer d'abord, quelle est la deuxième, etc.? Les espaces sont-ils les attributs définissants de la chaîne entrante? Sinon, cela ressemble à des regroupements aléatoires ... – DonBoitnott

Répondre

2

Si votre chaîne est toujours construire que la première et la dernière partie de chaîne (« C » et « AB ») sont sans espaces, vous pouvez utiliser quelque chose comme ceci:

string[] parts = "C 01 ABC 02 AB".Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
string part1 = parts[0]; // "C" 
string part2 = string.Join(" ", parts.Skip(1).Take(parts.Length - 2)); // "01 ABC 02" 
string part3 = parts[parts.Length - 1]; // "AB" 

Si elle est toujours fixé 5 pièces dont vous peut simplifier:

string[] parts = "C 01 ABC 02 AB".Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
string part1 = parts[0]; // "C" 
string part2 = string.Join(" ", parts.Skip(1).Take(3)); // "01 ABC 02" 
string part3 = parts[4]; // "AB" 
1

donc, si je vous comprends bien, vous voulez

"C 01 ABC 02 AB" ->    ["C", "01 ABC 02", "AB"]    // 3 items 
"C 01 ABC 02 bla bla bla AB" -> ["C", "01 ABC 02 bla bla bla", "AB"] // 3 items 
"C 01 02 AB"  ->    ["C", "01 02", "AB"]     // 3 items 

dans ce cas

String source = "C 01 ABC 02 AB"; 

    int first = source.IndexOf(' '); 
    int last = source.LastIndexOf(' '); 

    String[] line = new String[] { 
    source.Substring(0, first), 
    source.Substring(first + 1, last - first - 1), 
    source.Substring(last + 1), 
    }; 
1

Selon la façon dont différents les données d'entrée est vous pouvez aussi utiliser une expression régulière comme ^(.+)\s(\d+\s.+?\s\d+)\s(.+). Cela entraînera une correspondance avec trois groupes contenant les pièces séparées "C" "01 ABC 02" et "AB". Cela signifie que la partie médiane doit toujours exister de chiffres suivis d'une chaîne, puis de nouveaux chiffres. L'avantage supplémentaire est que vous vérifiez également que la chaîne d'entrée est d'un certain format.

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     var result = Regex.Match("C 01 ABC 02 AB", @"^(.+)\s(\d+\s.+?\s\d+)\s(.+)"); 
     Console.WriteLine(result.Groups[0].Value); // "C 01 ABC 02 AB" 
     Console.WriteLine(result.Groups[1].Value); // "C" 
     Console.WriteLine(result.Groups[2].Value); // "01 ABC 02" 
     Console.WriteLine(result.Groups[3].Value); // "AB" 
    } 
} 
1

Cela devrait le faire:

string x = "C 01 ABC 02 AB"; 
string s1 = x.Substring(0, 1); 
string s2 = x.Substring(2, x.Length - 5); 
string s3 = x.Substring(x.Length - 2); 

Considérant C et la longueur de AB ne changera jamais.

+0

semble beau mais tristement en utilisant les types de var sont désapprouvés dans notre société :) –

+0

Got it ainsi changé –

0

Vous pouvez utiliser une expression régulière pour extraire vos valeurs:

var pattern = new Regex(@"(?<first>[A-Z0-9]+)\s(?<second>(([0-9]+)\s([A-Z]+)\s[0-9]+))\s(?<third>[A-Z]+)"); 
var line = pattern.Match(input); 
var first = line.Groups["first"].Value; 
var second = line.Groups["second"].Value; 
var third = line.Groups["third"].Value; 

Ou vous pouvez substring les morceaux:

var first = line.Substring(0, line.IndexOf(' ')); 
var second = line.Substring(line.IndexOf(' ') + 1, line.LastIndexOf(' ') + 1); 
var third = line.Substring(line.LastIndexOf(' ') + 1); 

Ou utiliser LINQ pour sélectionner les différents morceaux:

string[] line = String.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
var first = line.First(); 
var second = string.Join(' ', line.Skip(1).Take(3).ToArray()); 
var third = line.Last(); 
+0

'ToArray()' ne sont pas nécessaires sur le dernier code. –