加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何优化此正则表达式的性能?

发布时间:2020-12-15 23:59:36 所属栏目:百科 来源:网络整理
导读:我正在使用正则表达式将文本限定引号中未包含的逗号替换为制表符空格. 我正在通过SSIS中的脚本任务运行文件内容的正则表达式.文件内容超过6000行. 我看到了一个在文件内容上使用正则表达式的示例,看起来像这样 String FileContent = ReadFile(FilePath,ErrIn
我正在使用正则表达式将文本限定引号中未包含的逗号替换为制表符空格.
我正在通过SSIS中的脚本任务运行文件内容的正则表达式.文件内容超过6000行.
我看到了一个在文件内容上使用正则表达式的示例,看起来像这样

String FileContent = ReadFile(FilePath,ErrInfo);        
Regex r = new Regex(@"(,)(?=(?:[^""]|""[^""]*"")*$)");
FileContent = r.Replace(FileContent,"t");

那个替换可以理解地把它的甜蜜时间放在一个体面的文件上.

有没有更有效的方法来运行这个正则表达式?
逐行读取文件并在每行运行正则表达式会更快吗?

解决方法

问题是前瞻,它在每个命令上一直到最后,导致O(n2)复杂性,这在长输入时是显而易见的.您可以通过在替换时跳过引号来一次完成它:

Regex csvRegex = new Regex(@"
    (?<Quoted>
        ""                  # Open quotes
        (?:[^""]|"""")*     # not quotes,or two quotes (escaped)
        ""                  # Closing quotes
    )
    |                       # OR
    (?<Comma>,)             # A comma
    ",RegexOptions.IgnorePatternWhitespace);
content = csvRegex.Replace(content,match => match.Groups["Comma"].Success ? "t" : match.Value);

这里我们匹配free命令和带引号的字符串. Replace方法接受一个回调,其条件是检查我们是否找到逗号,并相应地替换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读