正则表达式拆分并合并为单个记录

Posted

技术标签:

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

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

[0] 05300030000GN0030018

[1 个字段为必填项。

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

当前实施:

预期输出

【问题讨论】:

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

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

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 字母或数字以及紧靠当前位置右侧的非数字或字符串结尾。

【讨论】:

以上是关于正则表达式拆分并合并为单个记录的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式将字段拆分为数组的 Bash 脚本用于多字符分隔符

C# 正则表达式匹配案例 - 拆分字符串并写入文件输出

使用正则表达式分隔单个单词?

正则表达式之拆分姓名

如何使用正则表达式拆分字符串并包含空格

使用正则表达式拆分简单的 JSON 结构