Java中是否存在通配符这样的东西?

时间:2011-02-10 14:13:28

标签: java comparison wildcard

我正在运行一个比较程序,并且它会立即执行直接的“字符串到字符串”比较,如果它们是完全匹配,则输出它们是匹配的。

好吧,我希望添加一个允许“相似性”的附加功能......

所以例如:

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


if (em1.equals(em2)){
    output.writeUTF(dir + filenames[i]);
}

这是代码的一小部分。我喜欢它以便它跳过“00”并仍然将其识别为“几乎”相同的数字并仍然输出它。

我认为它看起来像String em2 = "524"+ ## +"646",但这显然只是一个概念

有没有人知道是否有办法拥有这种'通配符'(我从uni SQL中选择的一个术语),或者是否有另一种方法可以做这种相似类型的交易。

谢谢:)

9 个答案:

答案 0 :(得分:14)

您可以使用正则表达式:

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

答案 1 :(得分:7)

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

if (em1.matches("524..646"))
例如

.是一个代表any character的通配符。如果您想将通配符限制为数字,可以将其替换为\\d。)

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

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

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

答案 2 :(得分:2)

我认为上述RE解决方案的问题在于,您对第3或第4位相同的数字不感兴趣,但数字相同,但只有1/2位数。

这是一个更复杂的问题,但你基本上想要为你的两个字符串计算http://en.wikipedia.org/wiki/Hamming_distance。很多问题的众所周知的算法,所以你应该找到很多例子,但我担心标准库不会这样做。它也是一个for循环和一个计数器,所以你不应该有一个实现的问题 - 你失去了STL可以使用的一些优化潜力(比较两个字符串的地址,你必须比较两种情况下的整个字符串),但不多。

答案 3 :(得分:1)

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

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

使用正则表达式可能是95%的时间更好的选择,但更贵。

答案 4 :(得分:1)

正则表达式就是你想要的方式。对于您的示例,您需要"524\\d{2}646"之类的内容。请参阅Java API for Regex

另请参阅此处有用的Apache Commons IO库,因为它听起来像是在处理文件:https://commons.apache.org/proper/commons-io/javadocs/api-release/index.html?org/apache/commons/io/package-summary.html

答案 5 :(得分:0)

您应该使用Regular Expressions

答案 6 :(得分:0)

嗯,不幸的是,我相信apache commons StringUtil没有任何通配符操作。

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

-Or -

您可以尝试使用一些模糊逻辑:http://jfuzzylogic.sourceforge.net/html/index.html

答案 7 :(得分:0)

为什么人们不愿意只写一个简单的&直接算法?

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;

答案 8 :(得分:0)

如果您正在寻找表达通配符的其他方式,可以选择以下选项:

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

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