Java中是否有通配符字符?

8

我正在运行一个比较程序,目前它执行的是直接的“字符串对比”,如果它们完全匹配,它会输出它们是匹配的。

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

例如:

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


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

这是代码片段的一部分。我希望跳过“00”,但仍将其识别为“几乎”相同的数字并输出它。
我想它会看起来像String em2 = "524"+ ## +"646",但那显然只是一个概念。
有人知道是否有一种方法可以使用这种“通配符”(我从大学SQL中学到的一个术语),或者是否有其他方法来处理这种相似性问题吗?
谢谢 :)
9个回答

20

这个能用字母来做吗,就像 A-F 的十六进制字符一样? - user585522
是的,正则表达式可以做到这一点,而且还有很多其他功能(请参见http://www.regular-expressions.info/以获取有关正则表达式的一些非常好的信息)。 - Joachim Sauer
我需要下载这个正则表达式吗?还是它已经包含在标准的Java开发工具包中了? - user585522
@user:自Java 1.4以来,正则表达式一直是Java的一部分(在此之前也作为第三方库可用)。请参阅Pattern - Joachim Sauer

8

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

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

例如。
. 是通配符,代表任何字符。如果您想将其限制为数字,则可以将其替换为 \\d 。)
这里是一个更一般的变体,它可以将“0”与任何字符匹配:
String em1 = "52494646";
String em2 = "52400646";

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

2

通常可以使用startsWith、endsWith或contains的组合来查找一个字符串是否以另一个字符串开头、结尾或包含。你可以像这样将它们组合使用:

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

使用正则表达式在大多数情况下可能是更好的选择,但会更加昂贵。


2
我认为上述的正则表达式解决方案存在的问题是,你不是对第三或第四个位置相同的数字感兴趣,而是对除一两位数外完全相同的数字感兴趣。
这是一个更加复杂的问题,但基本上你想要计算两个字符串之间的http://en.wikipedia.org/wiki/Hamming_distance。这是许多问题的已知算法,因此你应该能够找到很多例子,但我担心标准库无法实现它。此外,这只是一个for循环和一个计数器,因此你不应该在实现时遇到问题 - 你会失去STL可以使用的一些优化潜力(比较两个字符串的地址,并且在任何情况下都必须比较整个字符串),但不会有更多的问题。

1

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;

1
也许因为构建通用的东西是编写代码的最佳方式。使用正则表达式,我们具有很大的编写能力,但会产生(轻微的)阅读能力不足。但仍然可能需要创建多个表达式来处理不同的情况。使用模糊逻辑更加通用,可以处理所有情况。使用直接算法只能处理一个特定的情况。 - bluefoot

0

如果你正在寻找一种不同的表达通配符的方式,这里有一个选项:

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

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

0

0

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

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

-或者-

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接