Java中有通配符这样的东西吗?

Java中有通配符这样的东西吗?,java,comparison,wildcard,Java,Comparison,Wildcard,我正在运行一个比较程序,此时它会直接进行“字符串到字符串”的比较,如果它们完全匹配,它会输出它们是匹配的 嗯,我希望添加一个额外的功能,允许“相似性” 例如: String em1 = "52494646"; String em2 = "52400646"; if (em1.equals(em2)){ output.writeUTF(dir + filenames[i]); } 这是一段代码。我希望它跳过“00”,仍然识别为“几乎”相同的数字,并且仍然输出它 我可以想象它看起来像S

我正在运行一个比较程序,此时它会直接进行“字符串到字符串”的比较,如果它们完全匹配,它会输出它们是匹配的

嗯,我希望添加一个额外的功能,允许“相似性”

例如:

String em1 = "52494646";
String em2 = "52400646";


if (em1.equals(em2)){
    output.writeUTF(dir + filenames[i]);
}
这是一段代码。我希望它跳过“00”,仍然识别为“几乎”相同的数字,并且仍然输出它

我可以想象它看起来像
String em2=“524”+##+“646”
,但这显然只是一个概念

有人知道有没有一种方法可以使用这种“通配符”(我从unisql中找到的一个术语),或者有没有另一种方法可以实现这种相似性类型的交易


谢谢:)

您可以使用正则表达式轻松解决此问题:

if (em1.matches("524..646"))
if (em1.matches("524[0-9]{2}646")) {
  // do stuff
}
比如说

是代表的通配符。如果希望将通配符限制为数字,可以将其替换为
\\d
。)

下面是一个更通用的变体,它将“0”与任何字符匹配:

String em1 = "52494646";
String em2 = "52400646";

if (em1.matches(em2.replaceAll("0", "\\\\d"))){
    System.out.println("Matches");
}

您可以使用正则表达式:

if (em1.matches("524..646"))
if (em1.matches("524[0-9]{2}646")) {
  // do stuff
}
有关特定于Java的文档,请参阅。对于正则表达式的某些用法(如上面的示例),在:、/和中有快捷方式方法


在正则表达式方面有很好的文档。

通常,您可以结合使用startsWith、endsWith或contains来查找字符串是否以其他字符串开头、结尾或包含其他字符串。您可以将这些组合使用,如

number.startsWith("524") && number.endsWith("646");

在95%的情况下,使用正则表达式可能是一个更好的选择,但成本更高。

正则表达式就是您想要的方法。例如,您可能需要类似于
“524\\d{2}646”
的内容。看


这里还可以看到有用的Apache Commons IO库,因为它听起来像是在处理文件:

您应该使用它。

很遗憾,我认为Apache Commons StringUtil没有任何通配符操作

如果我没记错的话,mysql JDBC连接器上有一个StringUtils类,它有一个比较字符串和通配符的方法

-或


您可以尝试使用一些模糊逻辑:

我认为上述重新解决方案的问题在于,您对第三位或第四位相同的数字不感兴趣,而对一位或两位相同的数字感兴趣


这是一个更复杂的问题,但您基本上想要计算两个字符串的值。众所周知的算法解决了很多问题,所以你应该找到很多例子,但我担心标准库做不到。此外,它是for循环和计数器,因此实现时不应该出现问题-您失去了STL可以使用的一些优化潜力(比较两个字符串的地址,并且在任何情况下都必须比较整个字符串),但没有更多。

为什么人们不愿意只编写简单直接的算法

boolean equals(String s1, String s2, char wildcard)

    if(s1.length() != s2.length()) 
        return false;

    for(int i=0; i<s1.length(); i++)
        char c1 = s1.charAt(i), c2 = s2.charAt(i);
        if(c1!=wildcard && c2!=wildcard && c1!=c2)
            return false;

    return true;
布尔等于(字符串s1、字符串s2、字符通配符)
如果(s1.length()!=s2.length())
返回false;

对于(int i=0;i如果您正在寻找一种不同的方式来表示通配符,这里有一个选项:

    String em1 = "52494646";
    String em2 = "52400646";

    if (em2.startsWith("524")){
      output.writeUTF(dir + filenames[i]);
    }

这可以用字母来完成吗,就像用A-F十六进制字符一样?是的,可以这样做,还有更多(关于regex的一些非常好的信息,请参阅)。大概我需要下载这个regex的东西?或者它是标准java开发工具包中的东西吗?@user:正则表达式从1.4开始就是java的一部分(在此之前已经作为第三方库提供)。请参阅。可能是因为构建泛型是编写代码的最佳方式。使用正则表达式,我们有很大的编写能力,但我们生成(一点)缺乏阅读能力。但我们可能需要创建多个表达式来处理不同的情况。使用模糊逻辑是非常通用的,可以处理所有情况。使用直接算法只能处理一种特定情况。