当前位置: 首页 > 面试题库 >

Java中的通配符匹配

应安国
2023-03-14
问题内容

我正在编写一个简单的调试程序,该程序将简单的字符串作为输入,其中可以包含星号以指示通配符匹配-任何

*.wav  // matches <anything>.wav
(*, a) // matches (<anything>, a)

我以为我会简单地采用该模式,转义其中的任何正则表达式特殊字符,然后将其替换\\*.*。然后使用正则表达式匹配器。

但是我找不到任何Java函数来转义正则表达式。我能找到的最佳匹配Pattern.quote,然而这正好将\Q\E在开始和字符串的结尾。

Java中有什么可以让您简单地进行通配符匹配而不必从头开始实现算法的?


问题答案:

使用一个简单的正则表达式

这种方法的好处之一是,我们还可以轻松添加令牌*(请参阅底部的 添加令牌 )。

搜索: [^*]+|(\*)

  • |匹配项的左侧匹配不是星号的所有字符
  • 右侧将所有星星捕获到第1组
  • 如果第1组为空:替换为\Q+匹配+E
  • 如果设置了组1:替换为 .*

这是一些工作代码(请参阅在线演示的输出)。

输入: audio*2012*.wav

输出: \Qaudio\E.*\Q2012\E.*\Q.wav\E

String subject = "audio*2012*.wav";
Pattern regex = Pattern.compile("[^*]+|(\\*)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
    if(m.group(1) != null) m.appendReplacement(b, ".*");
    else m.appendReplacement(b, "\\\\Q" + m.group(0) + "\\\\E");
}
m.appendTail(b);
String replaced = b.toString();
System.out.println(replaced);

添加令牌

假设我们还想?用一个点将通配符(代表单个字符)转换。我们只是将捕获组添加到正则表达式,并将其从左侧的matchall中排除:

搜索: [^*?]+|(\*)|(\?)

在replace函数中,我们添加如下内容:

else if(m.group(2) != null) m.appendReplacement(b, ".");


 类似资料:
  • 我有一个包含通配符的8个字符长的字符串列表(由表示),我需要将这些字符串与同样具有通配符的输入字符串匹配。所述字符串由四个字母字符(A-Z)和四个数字(0-9)组成。为了更容易理解,下面是一组字符串的示例: 如果我给作为输入,那么每次比较都应该解析为true。 此处理发生在线程内部,外部交互可以更改输入将检查的字符串列表(仅添加或删除)。

  • 问题内容: 有没有一种方法可以使用querySelector或进行通配符元素名称匹配querySelectorAll?我看到属性查询中支持通配符,但不支持元素本身。 我要解析的XML文档基本上是一个简单的属性列表,我需要查找名称中包含某些字符串的元素。 我意识到,如果我需要的话,XML文档可能需要进行重组,但这不会发生。 除了返回使用显然不推荐使用的XPath(IE9删除了它)之外,任何解决方案都

  • 问题内容: 这应该非常简单。如果我有这样的字符串: 那么通常会采用什么方式来获取与此模式匹配的文件列表?(例如,它应该匹配但不匹配 我看了一下,看起来像是对的野兽,但是我不确定如何使用它在相对目录路径中查找文件。 我想我可以查找ant的源代码,因为它使用了通配符语法,但是我必须在这里遗漏一些显而易见的内容。 (编辑:上面的示例只是一个示例案例。我正在寻找一种在运行时解析包含通配符的常规路径的方法。

  • 问题 你想使用 Unix Shell 中常用的通配符(比如 *.py , Dat[0-9]*.csv 等)去匹配文本字符串 解决方案 fnmatch 模块提供了两个函数—— fnmatch() 和 fnmatchcase() ,可以用来实现这样的匹配。用法如下: >>> from fnmatch import fnmatch, fnmatchcase >>> fnmatch('foo.txt',

  • 问题内容: 我想在输入字符串中搜索给定的字符串模式。 例如 现在,我需要搜索字符串URL是否包含“ ”。请帮我。 这是一个例子。实际上,我需要检查URL是否包含匹配“ / {a-zA-Z0-9} /”的字符串。 问题答案: 您可以为此使用类。如果您只想在中匹配单词字符,则可以使用以下正则表达式。是的简写。如果您可以,请使用或。

  • 我试图检查字符串是否包含完全匹配。例如: String str="这是我的字符串,具有-Policy和-p" 我怎样才能做到以下几点: