我想要一个正则表达式,它可以帮助我按组('id','description','category')拆分字符串,其中'id'是整数,'description'是自定义单词,'category'是预定义的单词( “C1”、“C2”、“C1 C2”、“C2 C3”、“C1 C2 C3”等)。字符串样本:
- "0 自定义描述文本 C1"
- 《25个自定义描述文字C2》
- 《100条自定义描述文字C1 C2》
- 《30个自定义描述文字C2 C3》
- 《45个自定义描述文字C1 C2 C3》
- “45 个自定义描述文本任何用户定义的类别文本”..... n(超过 1000 个)。“2 自定义描述文本任何用户定义的类别文本”
通常,正则表达式中的替换是从左到右评估的,因此首先检查最左边的替换项,并给予它们优先权):
(?<id>\d{1,3}) (?<description>.+) (?<category>(C1 C2 C3|C1 C2|C2 C3|C2|C1))
但它返回错误的结果 - 它检测到样本 #5 的类别 = 'C2 C3' (我不明白为什么会发生这种情况)
ps:实际上类别列表是我从文件加载的用户定义列表。这可以是任何字符串(实际上不是 C1、C2、C3 等)。有超过 1000 多个已知类别......现在我正在使用这样的解决方案:
将所有已知的“类别”添加到字符串数组
排序“类别”
var sortedCategories = categories.OrderByDescending(x => x.Length).ToArray();
对于每个类别,尝试解析给定的字符串
foresch(var category in sortedCategories) { //使用 $"(?\d{1,3}) (?.+) (?({category})" var match = Regex.Match(givenString, mask); if ( !match.Success) continue; //找到真正的类别。做一些事情 return; }
这个逻辑是有效的,但它需要很多时间。我相信我可以定义模式优先级的选项是存在的,但我在正则表达式方面很弱,需要帮助:) 在此先感谢