首页 > 解决方案 > 从文本中获取三重管道之间的所有字符串,例如 |||Hello|||

问题描述

我想|||Hello|||从文本中获取所有被三重管道(如)包围的字符串,并在 C# 中找到了这个正则表达式:

Regex regex = new Regex(@".*?\|\|\|(\w+)\|\|\|"); // searches strings, which are surrounded by three pipes >>> |||string|||
foreach (Match match in regex.Matches(strContent))
{
    lstReturn.Add(match.Groups[1].Value);
}

它适用于小字符串,但不适用于大文本(冻结而没有响应)。

你能告诉我如何使这个查询更快或建议一个替代方案吗?

标签: c#regexmatch

解决方案


模式开始处的.*?会使匹配变慢,因为一旦后续子模式失败,引擎需要执行更多检查。一旦没有|.*?“扩展”或“回溯”,并且非|char 与.*?. 对于非常长的字符串,这会导致灾难性的回溯。

第二种模式还允许内部优化,因为正则表达式引擎知道匹配将从|硬编码的字符开始。

您需要删除.*?,因为您不需要之前的部分|||word|||

您可以比较.*?\|\|\|(\w+)\|\|\|\|\|\|(\w+)\|\|\|匹配步骤:

第一:

在此处输入图像描述

第二个:

在此处输入图像描述

您可以在第一张图像中看到表示回溯的“红色箭头”更频繁地触发。


推荐阅读