2012-02-28 68 views
1

是否有机制来衡量或比较模式对给定字符串有多紧?模式我的意思是正则表达式或类似的东西。例如,我们有字符串“foobar”和两个正则表达式:“fooba”。“。*”这两种模式都与字符串匹配。是否有可能确定“fooba”。是给定字符串更合适的模式,然后“。*”?衡量“匹配”?

回答

0

有度量和启发式字符串“距离”。例如,检查这个例子:http://en.wikipedia.org/wiki/Edit_distance

这是随Google搜索一起提供的一个随机Java实现。

http://www.merriampark.com/ldjava.htm

一些指标来计算如此环顾四周,找到一个适合你的需要昂贵。

至于你具体的例子,IIRC,在Java正则表达式匹配通过匹配的长度,然后才能所以如果你使用类似

优先术语“(foobar的)|(。*)”,它将匹配第一你可以通过检查为两个捕获组返回的结果来确定这一点。

+0

需要更多的咖啡才能理解,但似乎是最可靠的方法。谢谢。 – jekamax 2012-03-01 12:37:31

0

这个怎么样的一个想法:使用正则表达式的长度:length("fooba.") > length(".*"),所以"fooba."更为具体...

然而,这取决于在正则表达式来自你需要如何精确因为"fo.*|.*ba"会比"fooba."长,所以解决方案不会总是有效。

+0

不幸的是,像“foob”,“foo。”,“fo *”等模式。通常会聚到一起。无论如何,感谢你的简单的第一次aproarch。 – jekamax 2012-02-28 15:45:16

+0

我想你可以在比较长度之前从正则表达式中删除任何非alpha字符。 – beny23 2012-02-28 15:50:31

+0

...或者为特殊字符加权做一些启发式操作。这可能有效。 – jekamax 2012-03-01 12:39:02

0

你所要求的并不是正则表达式的真正属性。

创建一个测量“接近度”的枚举,并创建一个将保存给定正则表达式和接近度值的类。这要求您确定哪个正则表达式被认为比另一个更接近。

实例化你的各个类,并让它们在你的代码上松动,并比较匹配的对象,让“最接近”一个出现在顶部。

伪代码,实际上并没有任何比较,或任何类似语言理智:

enum Closeness 
    Exact 
    PrettyClose 
    Decent 
    NotSoClose 
    WayOff 
    CouldBeAnything 
mune 

class RegexCloser 
    property Closeness Close() 
    property String Regex() 
ssalc 


var foo = new RegexCloser(Closeness := Exact, Regex := "foobar") 
var bar = new RegexCloser(Closeness := CouldBeAnything, Regex := ".*") 

var target = "foobar"; 

if Regex.Match(target, foo) 
    print String.Format("foo {0}", foo.Closeness) 
fi 

if Regex.Match(target, bar) 
    print String.Format("bar {0}", bar.Closeness) 
fi 
+0

在我的域名中,所有模式均由最终用户制作。据我所知,这意味着通过这种方式,最终用户需要明确地衡量每种模式。我怀疑它会适合。 – jekamax 2012-03-01 12:33:59