使用Regex有效地解析/ lex令牌

时间:2014-03-06 17:15:34

标签: c# .net regex vb.net performance

我试图找到一种在.NET中使用Regex来有效地确定字符串匹配的几种模式中的哪种模式的方法。如果我的令牌是固定文本,我会使用字典<>并简单地查找它们。然而,令牌可以具有嵌入其中的一个或多个数字序列以表示索引。我有几十到100个这样的代币。对于一个小例子,我想匹配以下其中一个令牌:

ORDERID
PRICE(\d+)
QUANTITY(\d+)
DESCRIPTION(\d+)
WEIGHT(\d+)_(\d+)

(想象的用例是我有一组名称 - 值对,名称使用嵌入的整数来允许重复。在这个例子中,想象一个有多行的订单,PRICE是第n行的价格.WEIGHT_是第n行第m个体对象的权重(想象一下,lineitem是某种套件)。

请注意,这些令牌的组成超出了我的控制范围。

我可以用

之类的东西有效识别这些代币
^(?<oid>ORDERID)|(?<prc>PRICE(\d+))|(?<qty>QUANTITY(\d+)|(?<dsc>DESCRIPTION(\d+)|(?<wght>WEIGHT(\d+)_(\d+)$

请注意,给定正则表达式的正则表达式匹配与您匹配的字符串的大小是线性的,并且当我添加更多标记时,它的效率不应超过log n。

现在做一场比赛:

Match m = r.Match("PRICE44")

不幸的是,据我所知,要确定哪个令牌与Regex.Match对象匹配,我必须遍历所有可能性:

m.Groups["oid"].Success
m.Groups["prc"].Success
m.Groups["qty"].Success
m.Groups["dsc"].Success
m.Groups["wght"].Success

随着令牌数量的增加,成本呈线性增长(或更可能是n log n)。如果有一个SuccessGroups集合,我可以迭代它,通常(在我的使用中)有一个元素:匹配的特定组。

我可以编写自己的解析算法来创建一个trie或类似的数据结构,但我不愿意重新实现Regex已经实现的东西,但似乎没有给我有效的访问权限。

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:0)

也许使用组,它会记录第一个匹配的,你可以迭代匹配而不是令牌 http://msdn.microsoft.com/en-us/library/bs2twtah%28v=vs.110%29.aspx#matched_subexpression