【问题标题】:wildcard search using replace function使用替换功能的通配符搜索
【发布时间】:2015-12-29 16:03:26
【问题描述】:

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

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

代码:

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

他们有没有人帮助我知道它是如何工作的?替换函数是什么概念?

【问题讨论】:

  • 它正在使用正则表达式...
  • 我知道,但是你能用小例子来展示一下吗?
  • 替换函数将用户输入* 转换为正则表达式理解的.*? 匹配任何非贪婪的...

标签: java search wildcard


【解决方案1】:

您所说的称为 glob pattern

在 Java 世界中,glob 模式更经常被翻译成正则表达式模式。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    • CharBuffer
    • Segment
    • String

    • StringBuffer
    • StringBuilder

    并用String 中的第二个CharSequence 替换每次出现的第一个CharSequence


    在您的情况下,如果 pattern 参数将包含 **??,则 text.matches 方法将获得 .?.?.*?.*? 作为输入,这也是 text 参数必须包含的内容(以regular expressions),以便成功匹配它们以及返回true的方法。

    澄清一下:

    Difference between .*? and .* for regex

    【讨论】:

    • 如果文本是黄色的,并且模式是 yel* .. 它将在模式中获取 * 之前的所有字符并检查是否可以在文本中替换它?或者它在文本中具有相同的内容并返回 true ?
    • 如果pattern为yel*,则通过replace方法将其转换为yel.*,这将匹配yellow,因为.*表示Any character, occuring 0 or more times。正则表达式备忘单:cheatography.com/davechild/cheat-sheets/regular-expressions
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2020-06-24
    • 1970-01-01
    • 2011-08-16
    • 2023-03-10
    • 2012-09-29
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多