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文件为特定布局生成正则表达式.然后我运行一个文件进行数据导入.我需要确保文件中的每一行都匹配它应该是的模式.因此,可以多次检查模式,可能是数千次.
您正在使用正则表达式解析50列CSV文件(使用制表符)?
您应该删除重复的选项卡,然后在\ t上拆分文本.现在,您将所有列都放在一个数组中.您可以使用ColumnDef对象集合来告诉您每列的内容.
编辑: 一旦你分开了东西,你可以选择使用正则表达式来验证每个值,这应该比使用巨大的单正则表达式快得多.
编辑2: 您还可以获得确切知道哪些列格式错误的额外好处,并且您可以产生类似"第12行第30列中的Sytax错误,预期日期格式"的错误.