c# - 从文本中获取三重管道之间的所有字符串,例如 |||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);
}
它适用于小字符串,但不适用于大文本(冻结而没有响应)。
你能告诉我如何使这个查询更快或建议一个替代方案吗?
解决方案
模式开始处的.*?
会使匹配变慢,因为一旦后续子模式失败,引擎需要执行更多检查。一旦没有|
被.*?
“扩展”或“回溯”,并且非|
char 与.*?
. 对于非常长的字符串,这会导致灾难性的回溯。
第二种模式还允许内部优化,因为正则表达式引擎知道匹配将从|
硬编码的字符开始。
您需要删除.*?
,因为您不需要之前的部分|||word|||
。
您可以比较.*?\|\|\|(\w+)\|\|\|
和\|\|\|(\w+)\|\|\|
匹配步骤:
第一:
第二个:
您可以在第一张图像中看到表示回溯的“红色箭头”更频繁地触发。
推荐阅读
- sharepoint - 如何在 PowerApps 上显示 subFloder 的项目?
- python - 如何从 id = 1 计算并将第一列命名为“Id”
- javascript - 用 d3.js 加载巨大的 Json 89000++ 行,这导致我加载速度非常慢,几乎杀死了 chrome
- javascript - CRM 自定义活动不返回输出参数
- reactjs - 虚拟 dom 在内存中是什么意思?
- java - 通知适配器、Activity/Fragment 或 POJO 以接收来自 API(改造)的实时消息?
- mongodb - 如何查询给定日期范围的 mongoDB?
- assembly - 程序已在 8086 中将控制权交还给操作系统
- react-native-maps - 我可以在 react-native-maps 中的多边形上显示小点吗
- c# - 如何在多台计算机上在 c# 上运行 exe