我正在运行一个比较程序,并且它会立即执行直接的“字符串到字符串”比较,如果它们是完全匹配,则输出它们是匹配的。
好吧,我希望添加一个允许“相似性”的附加功能......
所以例如:
String em1 = "52494646";
String em2 = "52400646";
if (em1.equals(em2)){
output.writeUTF(dir + filenames[i]);
}
这是代码的一小部分。我喜欢它以便它跳过“00”并仍然将其识别为“几乎”相同的数字并仍然输出它。
我认为它看起来像String em2 = "524"+ ## +"646"
,但这显然只是一个概念
有没有人知道是否有办法拥有这种'通配符'(我从uni SQL中选择的一个术语),或者是否有另一种方法可以做这种相似类型的交易。
谢谢:)
答案 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]);
}