动态构建的正则表达式运行速度极慢!

Nic*_*uso 5 .net c# regex xml performance

我通过运行一些xml结构动态生成正则表达式,并在我查看其节点类型时构建语句.我正在使用此正则表达式作为我定义的布局类型的一部分.然后我解析一个文本文件,在每行的开头有一个Id.这个id指向我一个特定的布局.然后我尝试将该行中的数据与其正则表达式进行匹配.

听起来不错,花花公子吧?唯一的问题是匹配字符串非常慢.我把它们设置为编译,以尝试加快速度,但无济于事.令人困惑的是,这些表达方式并不复杂.我绝不是一个正则表达式的大师,但我知道一个体面的关于他们的量把事情顺利.

这是生成表达式的代码......

StringBuilder sb = new StringBuilder();
//get layout id and memberkey in there...
sb.Append(@"^([0-9]+)[ \t]{1,2}([0-9]+)"); 
foreach (ColumnDef c in columns)
{
    sb.Append(@"[ \t]{1,2}");
    switch (c.Variable.PrimType)
    {
        case PrimitiveType.BIT:
            sb.Append("(0|1)");
            break;
        case PrimitiveType.DATE:
            sb.Append(@"([0-9]{2}/[0-9]{2}/[0-9]{4})");
            break;
        case PrimitiveType.FLOAT:
            sb.Append(@"([-+]?[0-9]*\.?[0-9]+)");
            break;
        case PrimitiveType.INTEGER:
            sb.Append(@"([0-9]+)");
            break;
        case PrimitiveType.STRING:
            sb.Append(@"([a-zA-Z0-9]*)");
            break;
    }
}
sb.Append("$");
_pattern = new Regex(sb.ToString(), RegexOptions.Compiled);
Run Code Online (Sandbox Code Playgroud)

实际的慢节......

public System.Text.RegularExpressions.Match Match(string input)
{
    if (input == null)
       throw new ArgumentNullException("input");

    return _pattern.Match(input);
}
Run Code Online (Sandbox Code Playgroud)

典型的"_pattern"可能有大约40-50列.我将不会粘贴整个模式.我尝试对每个案例进行分组,以便稍后我可以在Match对象中枚举每个案例.

任何可以提供极大帮助的提示或修改?或者这种情况会慢慢发挥作用?

编辑清晰度:对不起,我认为我第一次不够清楚.

我使用xml文件为特定布局生成正则表达式.然后我运行一个文件进行数据导入.我需要确保文件中的每一行都匹配它应该是的模式.因此,可以多次检查模式,可能是数千次.

Jas*_*her 8

您正在使用正则表达式解析50列CSV文件(使用制表符)?

您应该删除重复的选项卡,然后在\ t上拆分文本.现在,您将所有列都放在一个数组中.您可以使用ColumnDef对象集合来告诉您每列的内容.

编辑: 一旦你分开了东西,你可以选择使用正则表达式来验证每个值,这应该比使用巨大的单正则表达式快得多.

编辑2: 您还可以获得确切知道哪些列格式错误的额外好处,并且您可以产生类似"第12行第30列中的Sytax错误,预期日期格式"的错误.


Gum*_*mbo 5

一些表现想法:

  • [01]而不是(0|1)
  • 使用非捕获组而不是捕获组(如果您确实需要分组)(?:expr)

编辑    因为您的值似乎是由空格分隔的,为什么不将它拆分?