使用C#中的RegEx查找具有优化迭代次数的模式

时间:2012-08-24 00:11:03

标签: c# .net regex optimization

考虑以下两种情况,其中要测试的字符串将仅包含字符' a',' t'' g'和' c'任何组合,可以是任意长度。它可能只有'例如。

  • 测试是否' a'发生超过5次。如果字符串的长度为100且字符为' a'在前10个位置出现五次,正则表达式不应搜索剩余的字符串。
  • 测试是否连续零个' a'只发生一次,字符串不得以' a'结尾。有效示例:ggtcccccccctggtaaaatcg,gctgctcgtccttgcttcg,ag。无效:a,agatcttgcgt,agtcga。

现在我知道如何构建一个基本的正则表达式来测试这两种情况,但我想确保搜索得到优化并且不会浪费不必要的迭代。在上面的第二点中,agatcttgcgt应该在测试第三个字符后立即终止,因为它会破坏连续的规则。

优化正则表达式的任何帮助都会有所帮助。此外,不是主要问题,但我怎样才能看到搜索的执行方式(迭代次数等)?

1 个答案:

答案 0 :(得分:3)

如果性能至关重要,您可能需要考虑非正则表达式解决方案。例如,使用string.Contains可以轻松解决您的第一个要求。

正则表达式通常以线性方式从左到右扫描其输入,查看每个字符,直到找到匹配为止,如果有回溯,可能会多次查看字符。另一方面,存在一些高级string searching algorithms,可以确定子串的存在与否,而不必检查字符串中的所有字符。例如,要搜索aaaaa,您只需检查每五个字符,直到找到a

  

此外,不是主要问题,但我怎样才能看到搜索的执行方式(迭代次数等)?

您可以使用RegexBuddy调试正则表达式并查看需要多少步骤:

RegexBuddy: debugging a regex