获取三重管道之间的所有字符串,例如|||你好|||,来自一段文字
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+)\|\|\|
个匹配步骤:
第一个:
第二个:
您可以在第一张图片中看到表示回溯的“红色箭头”更频繁地触发。
我想从文本中获取所有被三重管道(如 |||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+)\|\|\|
个匹配步骤:
第一个:
第二个:
您可以在第一张图片中看到表示回溯的“红色箭头”更频繁地触发。