【发布时间】:2017-07-25 11:38:00
【问题描述】:
我想在 C# 中创建一个函数(如果需要,可以使用一组辅助函数),它可以执行与 awk '/start/,/end/' file 类似的操作 - 除了它将包含所有最后的匹配项,而不是在第一个匹配项上终止。
假设我们有:
# cat text
"13:08:30:5276604 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:5736962 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:6227343 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:6757752 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:7208103 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:7668739 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:8129079 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
预期:
"13:08:30:6227343 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:6757752 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:7208103 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:7668739 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
AWK 输出:
# awk '/13:08:30:62/,/13:08:30:7/' text
"13:08:30:6227343 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:6757752 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
"13:08:30:7208103 Main: 41044 - 48.7617 M-- Other PIDS 2 - 79.1016 M"
我最初认为我可能只是通过两个条件pattern_1 | pattern_2 获得正则表达式匹配,但是如果匹配值之间存在值,这将不起作用。
我还发现 C# StringBuilder 类没有 .indexOf() 和 .lastIndexOf() 方法(我在 JAVA 方面有更多经验,所以在我看到 C# 没有它们之前一直在考虑使用它们)。由于我没有这些方法并且可能需要实现它们,所以我想问一下这是否是可行的方法?如果需要大量搜索,本节甚至建议使用字符串:MSDN - 我当然也可以使用它。我选择使用StringBuilder是因为字符串拼接是不断进行的,是不是应该在构建字符串的时候使用stringbuilder类型(拼接很多),然后在搜索的时候转换成string类型?
我也希望它具有高性能,并且很高兴听到有关如何实现它的建议。一般指导和实施细节表示赞赏。
【问题讨论】:
-
您的问题有多具体?这应该只适用于这种特殊情况还是应该在与 awk 相同的范围内工作?
-
StringBuilder用于构建字符串。首先构建它,然后生成整个字符串并使用String函数进行搜索。 -
@MetaColon - 需要更多的通用性,而不仅仅是一个特定的案例。我会将其指定为:“给定 utf8 字符串中存在的两个模式,找到以第一个模式开头并以第二个模式结束的文本。”可以添加包含 /end/ 模式的整行的附加要求。 @D Stanley - 确认您在正确的轨道上总是好的,谢谢。
-
@MindaugasBernatavičius RegEx 应该适合该任务。
标签: c# performance