获取三重管道之间的所有字符串,例如|||你好|||,来自一段文字

Get all strings between triple Pipes, e.g. |||Hello|||, from a text

我想从文本中获取所有被三重管道(如 |||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);
}

对于小字符串,它可以正常工作,但不能用于大文本(冻结而无响应)。

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

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

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

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

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

第一个:

第二个:

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