使用替换功能的通配符搜索

wildcard search using replace function

我尝试使用一些算法(k-gram 算法等)在我的应用程序中实现通配符搜索,但它非常复杂。

直到我找到这段代码,它工作得很好..但我不知道它是如何检查和得到结果的!

代码:

public static boolean wildCardMatch(String text, String pattern)
{
  return text.matches( pattern.replace("?", ".?").replace("*", ".*?") );
}

他们有没有人帮助我知道它是如何工作的? replace函数是什么意思?

您使用的方法是String.replace(CharSequence target, CharSequence replacement)

它需要两个实现CharSequence接口的对象作为参数,可能是以下之一:

  • CharBuffer
  • Segment
  • String

  • StringBuffer
  • StringBuilder

并在 String 中用第二个 CharSequence 替换第一个 CharSequence


在你的例子中,如果 pattern 参数包含 **??text.matches 方法将得到 .?.?.*?.*? 作为输入,这就是 [=24] =] 参数也必须包含(根据 regular expressions),以便成功匹配它们和方法 return true.

澄清一下:

Difference between .*? and .* for regex

你说的是glob pattern.

在 Java 世界中,glob 模式更常被转换为正则表达式模式。

在您的方案中,实现非常基本:replace 方法用于将所有出现的 ? 替换为正则表达式等价物 .?。然后所有出现的 * 都被替换为 .*?.

因此,如果您有以下 glob 模式:abc*.def,则正则表达式将变为 abc.*?.def.

当正则表达式最终准备就绪时,将使用方法 matches 对变量 text 进行检查。后一种方法接受正则表达式作为输入。