【问题标题】:counting a string with special characters in a string in c#在c#中计算字符串中具有特殊字符的字符串
【发布时间】:2020-08-13 12:34:13
【问题描述】:

我想在另一个字符串(日志文件)中计算一个字符串(搜索词)。 用Split方法拆分字符串,然后搜索数组对我来说效率太低了,因为日志文件非常大。

In the net我发现了以下可能性,到目前为止效果很好。然而,

count = Regex.Matches(_editor.Text, txtLookFor.Text, RegexOptions.IgnoreCase).Count;

我现在遇到了另一个问题,当我以“Nachricht erhalten (”) 格式计算字符串时出现以下错误。

错误信息:

System.ArgumentException: "Nachricht erhalten (" 已分析 - 没有足够的 )-字符。

【问题讨论】:

    标签: c# string counting


    【解决方案1】:

    您需要转义 ( 符号,因为它在正则表达式中有一个特殊的 function

    var test = Regex.Matches("Nachricht erhalten (3)", @"Nachricht erhalten \(", RegexOptions.IgnoreCase).Count;
    

    如果您在用户不熟悉正则表达式的情况下通过用户输入来执行此操作,您可能更容易在while 循环中使用IndexOf,您可以继续使用在最后一个循环中找到的新索引。这在性能上也可能比正则表达式好一点。示例:

    var test = "This is a test";
    var searchFor = "is";
    var count = 0;
    var index = test.IndexOf(searchFor, 0);
    while (index != -1)
    {
        ++count;
        index = test.IndexOf(searchFor, index + searchFor.Length);
    } 
    

    【讨论】:

    • 还有其他字符,我需要转义吗?喜欢 " - . > ?
    • @Soeren3003 见:What characters need to be escaped in .NET Regex?,你可以简单地使用 Regex.Escape
    • if you do this by user input -> 小心,不应该不小心执行任意正则表达式(使用超时或实例)。这不仅仅是为了用户的简单,它也可能是一个漏洞(拒绝服务,请参阅 [meziantou.net/regex-deny-of-service-redos.htm] 并搜索“灾难性回溯”
    • 感谢您提供的信息和源代码。我已经比较了一次并得出以下结果:00.0396874 sec While 和 00.0039259 sec 正则表达式。尽管如此,我还是决定使用 while 循环,因为性能足以满足我的应用程序。
    • @Soeren3003 是的。这取决于上下文。正则表达式在少数情况下很快,但对于出现多次的较大文件,由于产生的分配(这也会迅速消耗内存),它会变得非常慢。
    猜你喜欢
    • 2021-01-21
    • 2019-09-03
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多