【发布时间】:2013-08-07 19:51:11
【问题描述】:
我已经多次遇到这种情况:某些文本可能会匹配多种模式,而您想根据它是哪种模式来做一些特定的事情。
在过去,我总是只使用正则表达式列表并迭代直到找到匹配项。
我想知道是否有更有效的数据结构。例如,如果我使用 C#,则使用带有正则表达式键的字典。
我意识到,如果模式都是前缀或后缀,那么像 Trie 这样的东西是有意义的。不过,我不清楚这是否适用于一般情况。
在我看来,关键冲突可能存在一些歧义;例如,如果某些文本匹配多个模式,应该返回什么? (我认为在这种情况下,也许一个非确定性的结果是可以的;但只要记录了行为,我就可以接受。)
无论如何,这样的数据结构是否存在,无论是在 .NET 中还是在其他地方?
【问题讨论】:
-
可能不是您要查找的内容,但如果使用 c# 列表,请使用
FirstOrDefault(x=>doesItMatch(x))。仍然必须遍历每一个,但它会在第一个有效的时候停止。 -
我不确定以比 O(n) 更好的方式做到这一点的可能性有多大。
-
@SLaks:我也不确定!但我之前曾被聪明的数据结构所震撼。
-
如果正则表达式可以通过它们的逻辑排他性(例如,任何不匹配模式 A 的东西不可能匹配模式 B)组织成一个逻辑树,那么你可以减少比较。树最简单的数据结构是链表。
标签: c# .net regex data-structures