如何从模式中检测序列中的偏差?

时间:2011-05-08 11:29:41

标签: regex antlr state-machine deviation

我想检测一系列动作偏离给定模式的段落,但无法找到一个聪明的解决方案,尽管这个问题听起来很简单。

模式的目标是以某种方式描述正常序列。更具体地说:“动作序列中应该或不应该包含哪些动作以及按什么顺序?”然后我想将动作序列与模式匹配,并检测偏差及其位置。

我的第一个方法是使用正则表达式。这是一个例子:

Example 1:
Pattern: A.*BC
Sequence: AGDBC (matches)
Sequence: AGEDC (does not match)

Example 2:
Pattern: ABCD
Sequence: ABD (does not match)
Sequence: ABED (does not match)
Sequence: ABCED (does not match)

Example 3:
Pattern: ABCDEF
Sequence: ABXDXF (does not match)

使用正则表达式,检测错误很简单,但不会发生错误。我的方法是连续删除最后一个正则表达式块,直到我可以找到序列中的模式。然后我将知道最后的正确行动,并至少找到了第一个偏差。但这对我来说似乎不是最好的解决方案。此外,我不能所有的偏差。

我脑子里的其他灵魂正在使用状态机,像ANTLR这样的订单工具。但我不知道他们是否可以解决我的问题。 我想检测遗漏和委托的错误,并给用户创建自己的模式的可能性。你知道这样做的好方法吗?

3 个答案:

答案 0 :(得分:0)

在匹配您的输入时,正则表达式引擎会提供有关不匹配位置的信息 - 但是它可能无法以您可以轻松访问它的方式提供它。

考虑例如实现表达式的DFA。它按顺序获取字符,将它们与期望值匹配,并且您对序列中没有有效匹配的点感兴趣。

其他实现可能会反复出现,您会对所获取的任何字符的最大地址感兴趣。

在Java中,这可以通过向

提供CharSequence实现来完成
   java.util.regex.Pattern.matches(String regex, CharSequence input) 

其中访问者方法跟踪最大索引。

但是,我没有尝试过。它也无法帮助您对错误进行分类。

答案 1 :(得分:0)

你看过马尔可夫链吗? http://en.wikipedia.org/wiki/Markov_chain - 听起来你想要意想不到的过渡。也许隐藏的马尔可夫模型http://en.wikipedia.org/wiki/Hidden_Markov_Models

答案 2 :(得分:0)

查找正则表达式的开源实现,并添加一个钩子来返回/设置/打印/保存失败的索引,如果给定的比较不匹配的话。或者,编写自己的RE引擎(不适合胆小的人),这样就可以完全按照自己的意愿行事!