Jonas Johansson Jonas Johansson - 3 months ago 12
ASP.NET (C#) Question

Spitting string into array with specific delimer

Would like to find a way to split a string info a array in as shown below. The delimer is always in the format:

string + int + int + int

P000 or P000 + P000 or P000 + P000 + P000


String:

P210 Får inte utsättas för värme, heta ytor, gnistor, öppen låga eller andra antändningskällor. Rökning förbjuden. P220 Hålls/förvarad åtskilt från kläder/brännbara material. P273 Undvik utsläpp till miljön. P280 Använd skyddshandskar/ skyddskläder/ ögonskydd/ ansiktsskydd. P333 + P313 Vid hudirritation eller utslag: Sök läkarhjälp. P403 + P235 Förvaras på väl ventilerad plats. Förvaras svalt. P403 + P235 + P236 Förvaras på väl ventilerad plats. Förvaras svalt. I mörker.


Desired output:

P210 Får inte utsättas för värme, heta ytor, gnistor, öppen låga eller andra antändningskällor. Rökning förbjuden.
P220 Hålls/förvarad åtskilt från kläder/brännbara material.
P273 Undvik utsläpp till miljön.
P280 Använd skyddshandskar/ skyddskläder/ ögonskydd/ ansiktsskydd.
P333 + P313 Vid hudirritation eller utslag: Sök läkarhjälp.
P403 + P235 Förvaras på väl ventilerad plats. Förvaras svalt
P403 + P235 + P236 Förvaras på väl ventilerad plats. Förvaras svalt. I mörker.


.

Answer

I suggest matching, not splitting (since you want delimeters being included):

  string source = "P210 Får inte utsättas ... Förvaras svalt. I mörker.";
  ...
  string pattern = @"(?<index>P[0-9]{3}( \+ P[0-9]{3}){0,2})(?<text>.+?)(?=(P[0-9]{3})|$)";

  string[] lines = Regex.Matches(source, pattern)
    .OfType<Match>()
    .Select(match => match.Value)
    .ToArray();