【发布时间】:2018-05-19 17:24:03
【问题描述】:
我有由管道字符分隔的字符串。这是一个可重复的序列:
<machinenr>|<controldone>|<nrofitems|<items>
无论您在哪里看到项目标签,您都会看到项目编号也由中间的竖线字符分隔。好吧,它不是一种智能格式,但我必须解决它,我想在 C# 中使用正则表达式。所以假设上面的格式让我们有一个真实的例子:
446408|0|2|111|6847|446408||0||
注意理论上管道之间不需要有值,内容也不受长度限制。项目 ID 可以是 111 或 877333,但也可以是混合字母数字 ID XB111。所以这里我们有两台没有物品的机器:
446408|0|0||447400||0||
这里我们有几台机器没有或有一些物品。请注意,管道字符也用于分隔项目,因此管道中有管道:
446408|0|1|111|446408|0|3|99884|111|73732|446408|0|0||
这台机器有三个项目: 446408|0|3|99884|111|73732|
项目ID:
99884|111|73732
正则表达式应该是什么样的?我已尝试使用以下命名组(更易于阅读),但它不起作用:
^(?P<machinenr>.*?)\|
(?P<controldone>.*?)\|
(?P<nrofitems>.*?)\|
(?P<items>.*?)\|
这里是对@Atterson @sln 和 @ 的澄清。注意,物品的数量可以是0-n,数量没有限制。让我们举个例子,一个带有机器的长字符串及其项目:446408|0|1|111|446408|0|3|99884|111|73732|446408|0|0||我期望正则表达式做的是将此字符串分解为三个匹配项/部分及其值,第一个匹配项是:446408|0|1|111|第二场比赛:446408|0|3|99884|111|73732|第三场比赛:446408|0|0||好的,以每个部分应该被分成的值为例,让我们使用第二个匹配/部分。它是一台nr 446408的机器,它没有被控制为0,它有3个项目,项目ID:99884|111|73732。在这些项目之后,一个新的序列:
<machinenr>|<controldone>|<nrofitems|<items>
可以关注。 @Sanxofon 请在此处检查您的正则表达式:[链接]https://regex101.com/r/kC3gH0/87,不幸的是,您会看到它不匹配。
【问题讨论】:
-
请清楚输入:2 或 3 个示例字符串以及您期望的完全匹配或替换后的最终字符串(如果您想替换)
-
到目前为止,您还没有正确描述 管道分隔字段 与 管道分隔值。这是必需的,即使是固定数量的字段。
-
您使用的是
.而不是[^\|]。和beeing greedy,你的正则表达式不起作用。 -
这个一点都不清楚。请提供一些非常清楚的格式解释,您的插图只是“不要点击”。
-
有没有办法区分机器号和项目字段的一部分?