使用特定的delimer将字符串吐入数组

时间:2016-08-11 11:54:15

标签: c# asp.net regex

想要找到一种方法将字符串信息拆分为一个数组,如下所示。定界符始终采用以下格式:

string + int + int + int

P000 or P000 + P000  or P000 + P000 + P000

字符串:

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.

期望的输出:

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.

3 个答案:

答案 0 :(得分:4)

我建议匹配,而不是拆分(因为您希望包含包含):

  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();

答案 1 :(得分:2)

Regex.Replace(str, @"(?<!\+ )(P\d\d\d)", "\n$1");

除非有可能在具有"+ "的群组之前找到文字Pxxx,否则这在大多数情况下都有效;例如text + P123不会拆分。虽然这可能不是100%防故障,但在您的情况下可能就足够了,并且易于阅读/理解。

它的作用是寻找与P[digit][digit][digit]不匹配的"+ "字符串,然后将其拆分。

请注意,您可以将\d\d\d替换为\d{3}

Test it online

正则表达式解释:

(?<!                 Do not match anything following this text (this is called a negative lookbehind)
    \+               A plus sign and a space
       )
        (P\d\d\d)    A P and 3 digits, parentheses allow us to "save" this group for later

\n$1                 Replace with a newline character and the first group within parentheses (not that the "do not match" part is not included in this)

答案 2 :(得分:0)

您可以通过迭代字符串中的每个字符来实现此目的。您可以使用Char.IsDigit和Char.IsChar方法确定字符是int还是字符串。