Regex 量度「;“匹配”吗;?

Regex 量度「;“匹配”吗;?,regex,pattern-matching,Regex,Pattern Matching,是否有机制测量或比较模式与给定字符串对应的紧密程度?我所说的模式是指正则表达式或类似的东西。例如,我们有字符串“foobar”和两个正则表达式:“fooba.”和“*”这两种模式都匹配字符串。有没有可能确定“fooba.”比“*”更适合给定字符串的模式呢?这个想法怎么样:使用正则表达式的长度:length(“fooba”)>length(.*),所以的“fooba.”更具体 但是,这取决于正则表达式的来源和精度,因为“fo.*.*ba”比“fooba”长。,所以解决方案并不总是有效。您所要求的并

是否有机制测量或比较模式与给定字符串对应的紧密程度?我所说的模式是指正则表达式或类似的东西。例如,我们有字符串“foobar”和两个正则表达式:“fooba.”“*”这两种模式都匹配字符串。有没有可能确定“fooba.”比“*”更适合给定字符串的模式呢?

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


但是,这取决于正则表达式的来源和精度,因为
“fo.*.*ba”
“fooba”长。
,所以解决方案并不总是有效。

您所要求的并不是正则表达式的属性

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

实例化您的各种类,让它们在您的代码中自由运行,并比较匹配的对象,让“最接近”的一个上升到顶部

伪代码,没有实际比较任何东西,或类似于任何理智的语言:

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

字符串“距离”有度量和启发式方法。例如,检查这个

下面是一个随谷歌搜索而来的随机Java实现

有些指标的计算成本很高,所以请四处看看,找到一个适合您需要的指标

对于您的特定示例,Java中的IIRC、regex匹配通过匹配长度来确定术语的优先级,然后排序,如果您使用


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

不幸的是,“foob”、“foo.”、“fo*”等模式通常同时出现。无论如何,感谢您简单的第一步。我想您可以在比较长度之前从regexp中删除任何非alpha字符……或者对特殊字符进行一些加权的启发。在我的领域,所有的模式都是由最终用户制作的。正如我所理解的,这意味着使用这个方法,最终用户需要明确地对每个模式进行加权。我怀疑它是否合适。需要更多的咖啡来理解,但这似乎是deeg最有希望的方式。非常感谢。