【问题标题】:Regex split and merge into single record正则表达式拆分并合并为单个记录
【发布时间】:2021-05-21 08:51:18
【问题描述】:

在我的 C# 应用程序中,我使用下面的正则表达式来拆分字符串 ([A-Z0-9]{20}\d{0})。但它将 ErrorCode 和 ErrorMsg 拆分为两个不同的记录,但我需要 Single Array 记录中的 ErrorCode 和 ErrorMgs。 例如: 当前逻辑:

[0] 05300030000GN0030018

[1 个字段为必填项。

但我需要像下面这样的 [0] 05300030000GN0030018必填字段。

当前实施:

预期输出

【问题讨论】:

  • 为什么不input.Split('.')?或者,Regex.Split(input, @"(?<=\.)") 如果. 必须仍然存在?
  • 我们不应该用 (.) 分割,因为有时错误消息会由多个点组成
  • 好的,我知道\d{0} 被使用是希望如果[A-Z0-9]{20} 之后的下一个字符是数字,则匹配失败,对吧?

标签: c# regex arraylist split


【解决方案1】:

假设msg 永远不会为空,并且如果[A-Z0-9]{20} 之后的下一个字符是数字,则使用\d{0} 使任何匹配失败,您可以使用

var result = Regex.Matches(input, @"\b[A-Z0-9]{20}\D.*?(?=\b[A-Z0-9]{20}\D|\z)", RegexOptions.Singleline)
            .Cast<Match>()
            .Select(x => x.Value)
            .ToList();

请参阅regex demo。请注意,如果msg 可以为空,您需要使用(?!\d) 前瞻而不是\D@"\b[A-Z0-9]{20}(?!\d).*?(?=\b[A-Z0-9]{20}(?!\d)|\z)"

详情

  • \b - 字边界(需要确保字符限制正常)
  • [A-Z0-9]{20} - 二十个大写 ASCII 字母或数字
  • \D - 非数字字符
  • .*? - 尽可能少的零个或多个字符
  • (?=\b[A-Z0-9]{20}\D|\z) - 正向前瞻,需要单词边界、20 个大写 ASCII 字母或数字以及紧靠当前位置右侧的非数字或字符串结尾。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多