【问题标题】:Spitting string into array with specific delimer将字符串拆分为具有特定分隔符的数组
【发布时间】:2016-08-11 11:54:14
【问题描述】:

希望找到一种方法将字符串信息拆分为数组,如下所示。分隔符始终采用以下格式:

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.

.

【问题讨论】:

  • 我试图通过循环字符串来做到这一点,当找到字符“P”获取它的索引时,如果以下两个字符是整数,这表明数组中的新位置应该是已添加

标签: c# asp.net regex


【解决方案1】:

我建议匹配,而不是分割(因为你希望包含分隔符):

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

【讨论】:

  • 请注意,您可以使用\d 来避免写[0-9]
  • @pie3636: \d 不等于[0-9],例如\d 也包括波斯数字:۱
  • 谢谢,我完全不知道。查了一下,在 JavaScript 等其他一些语言中,它似乎只包含[0-9]
  • 或者用(?=(?&lt;!P\d+\s*\+\s*)P\d+)拆分。此外,如果您使用 RegexOptions.ECMAScript 标志,\d 等于[0-9]
【解决方案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)

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的,或者使用正则表达式。这不是答案,而是评论。您可以通过编辑问题或回答 2-3 个问题轻松获得所需的 50 积分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多