想要找到一种方法将字符串信息拆分为一个数组,如下所示。定界符始终采用以下格式:
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.
答案 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}
。
正则表达式解释:
(?<! 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还是字符串。