【发布时间】:2022-10-04 17:24:43
【问题描述】:
我正在寻找一个 C# 正则表达式解决方案来匹配/捕获一些小而复杂的数据块。我的数据库中有数千个非结构化数据块(来自第三方数据存储),看起来类似于:
not BATTCOMPAR{275} and FORKCARRIA{ForkSpreader} and SIDESHIFT{WithSSPassAttachCenterLine} and TILTANGLE{4up_2down} and not AUTOMATSS{true} and not FORKLASGUI{true} and not FORKCAMSYS{true} and OKED{true}
我希望能够将其拆分为离散的部分(正则表达式匹配/捕获),如下所示:
not BATTCOMPAR{275}
and FORKCARRIA{ForkSpreader}
and SIDESHIFT{WithSSPassAttachCenterLine}
and TILTANGLE{4up_2down}
and not AUTOMATSS{true}
and not FORKLASGUI{true}
and not FORKCAMSYS{true}
and OKED{true}
CONTAINER{Container}
数据将始终符合以下规则:
- 在每个数据块的末尾会有一个用大括号括起来的字符串,如下所示:
{275} - “花括号分组”总是出现在以
not或and或and not开头的字符串的末尾,或者什么都没有。 "nothing" 与and相同,并且仅在它是字符串中的第一个块时才会出现。例如,如果我的and OKED{true}出现在字符串的开头,则and将被省略,OKED{true}将不加前缀(空字符串)。但它与and 相同。 - 在运算符(
and或not或and not或什么都没有)之后总会有一个字符串指示符,它在花括号分组之前结束。示例:BATTCOMPAR - 它出现字符串指示符将始终触及花括号分组,中间没有空格,但我不是 100% 确定。正则表达式应适应字符串指示符和左花括号之间可能出现空格的情况。
- 以上几点总结#1:每个块将有3个不同的子组:运算符(如
and not)、字符串指示符(如BATTCOMPAR)和花括号分组(如{ForkSpreader}) . - 上述要点的总结 #2:每个块将以列出的 3 个运算符之一开始,或者不以任何字符开头,并以右花括号结束。保证整个段中只有 1 个左花括号和 1 个右花括号,并且它们总是在段的末尾分组在一起。不用担心在该段的其他部分遇到额外的/杂散的花括号。
我尝试了几种不同的正则表达式结构:
匹配花括号分组:
Regex regex = new Regex(@"{(.*?)}");
return regex.Matches(str);
以上几乎可以工作,但只得到花括号分组,而不是随之而来的运算符和字符串指示符。
根据字符串前缀捕获块,尝试匹配运算符字符串:
var capturedWords = new List<string>();
string regex = $@"(?<!\w){prefix}\w+";
foreach ( Match match in Regex.Matches(haystack, regex) ) {
capturedWords.Add(match.Value);
}
return capturedWords;
以上部分有效,但仅获得运算符,而不是我需要的整个块:(运算符 + 字符串指示符 + 花括号分组)
提前感谢您的帮助。
【问题讨论】:
-
在没有深入研究需求的情况下,仅使用splitting at e.g.
(?<=})\s+(右大括号后的空格)会有什么问题
标签: c# regex regex-group