正则表达式拆分并合并为单个记录
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 字母或数字以及紧靠当前位置右侧的非数字或字符串结尾。
【讨论】:
以上是关于正则表达式拆分并合并为单个记录的主要内容,如果未能解决你的问题,请参考以下文章