【发布时间】:2010-10-22 16:22:07
【问题描述】:
我通过运行一些 xml 结构并在遍历其节点类型时构建语句来动态生成正则表达式。我将此正则表达式用作我定义的布局类型的一部分。然后我解析一个文本文件,该文件在每行的开头都有一个 Id。这个 id 指向一个特定的布局。然后我尝试将该行中的数据与其正则表达式进行匹配。
听起来不错,不错吧?唯一的问题是匹配字符串非常慢。我将它们设置为已编译以尝试加快速度,但无济于事。令人费解的是,这些表达方式并没有那么复杂。我绝不是 RegEx 专家,但我体面了解他们以使事情顺利进行。
这是生成表达式的代码...
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);
实际慢的部分...
public System.Text.RegularExpressions.Match Match(string input)
{
if (input == null)
throw new ArgumentNullException("input");
return _pattern.Match(input);
}
一个典型的“_pattern”可能有大约 40-50 列。我将从粘贴整个模式中保存。我尝试对每个案例进行分组,以便稍后在 Match 对象中枚举每个案例。
有什么可以大有帮助的提示或修改吗?或者这是意料之中的缓慢运行?
为澄清而编辑:抱歉,我认为我第一次不够清楚。
我使用 xml 文件为特定布局生成正则表达式。然后我运行一个文件进行数据导入。我需要确保文件中的每一行都与它所说的模式匹配。因此,可以多次检查模式,可能是数千次。
【问题讨论】:
-
您是否尝试将 CSV 与此正则表达式匹配?
-
其制表符分隔来自 SAS 的输出
-
你真的需要正则表达式来做到这一点吗?
-
如果它会这么慢,那就不行!我试图确保数据类型与每行的指定布局相匹配。也可以有任意数量的布局。
-
看看我下面的帖子。这应该可以让你用相当好的性能做你想做的事。
标签: c# .net xml regex performance