[英]Java String contains “splitted” String
即使B字符不连续,检查Java字符串A是否包含另一个字符串B的最佳方法是什么?
例如:“ takaderoka”包含“ tkdr”,但不包含“ tkkr”。
是否有内置函数,还是我必须编写自己的函数? 谢谢。
没有内置功能,但可以一行完成:
"takaderoka".matches("tkkr".replace("", ".*"));
或将其放在函数中:
static boolean matcher(String one, String two) {
return one.matches(two.replace("", ".*"));
}
可以用作实用程序方法的简单Java程序。 [ 也考虑顺序。 ]
public static boolean isMatched(String s1, String s2) {
int index = -1;
for (char ch : s2.toCharArray()) {
if ((index = s1.indexOf(ch, index + 1)) == -1) {
return false;
}
}
return true;
}
...
System.out.println(isMatched("takaderoka", "tkdr")); // true
System.out.println(isMatched("takaderoka", "tkkr")); // false
您可以使其更加优化 :
public static boolean isMatched(String s1, String s2) {
if ((s1.length() > 0 && s2.length() == 0) || (s2.length() > s1.length())) {
return false;
} else if (s1.indexOf(s2) != -1 || s1.equals(s2)) {
return true;
} else {
int index = -1;
for (char ch : s2.toCharArray()) {
if ((index = s1.indexOf(ch, index + 1)) == -1) {
return false;
}
}
}
return true;
}
您可以在搜索字符串上执行匹配的正则表达式,并在每个字符之间插入“。*”,或者依次写自己的搜索每个字符。
您可以使用String类的contains()方法。 在Java中检查String类的方法以及Regex表达式。
我会使用Apache Commons StringUtils。 getLevenshteinDistance()函数。
基本上,它衡量将一个字符串转换为另一字符串时必须进行的修改。 因此,您的问题与知道将所有其他字母转换为空是否等于它们的长度之间的差完全相同。
例如
StringUtils.getLevenshteinDistance("takaderoka","tkdr"); //6,
StringUtils.getLevenshteinDistance("takaderoka","tkkr"); //7,
如果结果=“ takaderoka” .length-“ tkdr” .length = 6,则“ takaderoka”包含“ tkdr”
您可以使用此方法。 可以重构为具有更好的代码。
private boolean contains(String source, String toMatch) {
boolean result = false;
if (toMatch.length() == 0 || source.length() == 0) {
return result;
}
int j = 0;
for (int i = 0; i < source.length(); i++) {
if (toMatch.length() - j > source.length() - i) {
break;
}
if (source.charAt(i) == toMatch.charAt(j)) {
j++;
}
if (j == toMatch.length()) {
result = true;
break;
}
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.