java,如何确定字符串是否包含特定顺序的子字符串
我有两个字符串要比较java,如何确定字符串是否包含特定顺序的子字符串,java,string,Java,String,我有两个字符串要比较 String st1 = "database-2.0/version\"25-00\""; String st2 = "database2.0version25"; 我想确定st1是否包含st2。在提供的示例中,我希望得到Yes作为答案,因为st2中的字符顺序与st1相同,并且它只缺少一些字符。Java库中是否有函数可以进行这种比较?我知道st1.indexOf(st2)和st1.contains(st2),但它们在本例中不起作用,都返回false 试试这个: Strin
String st1 = "database-2.0/version\"25-00\"";
String st2 = "database2.0version25";
我想确定st1是否包含st2。在提供的示例中,我希望得到Yes作为答案,因为st2中的字符顺序与st1相同,并且它只缺少一些字符。Java库中是否有函数可以进行这种比较?我知道st1.indexOf(st2)
和st1.contains(st2)
,但它们在本例中不起作用,都返回false 试试这个:
String regex = st2.chars()
.mapToObj(i -> String.valueOf((char) i))
.map(str -> ".*+?^${}()|[]\\".contains(str) ? "\\" + str : str)
.collect(Collectors.joining(".*", ".*", ".*"));
boolean contains = st1.matches(regex);
下面是一个概要:
- 获取一个较短字符串的正则表达式字符串(
在我们的例子中是硬编码的-当然,您可以自动执行此操作),在前后以及每个字符之间添加st2
。(*
匹配任何字符的0个或多个)*
返回一个String.chars()
,使用类型转换将其转换为IntStream
String
- 正如@Robert所建议的,用反斜杠转义特殊字符
- 检查长字符串匹配,这实际上意味着它包含短字符串的所有字符,甚至更多
haystack
中查找子序列指针
,方法是按顺序查找指针
,从查找每个连续字符时更新的索引searchFrom
开始
在下面的代码中,请注意haystack.indexOf(neederchar,searchFrom)
返回neederchar
第一次出现的索引,从haystack
中的indexsearchFrom
开始
boolean contains(String haystack, String needle) {
int searchFrom = 0;
for (char needleChar : needle.toCharArray()) {
searchFrom = haystack.indexOf(needleChar, searchFrom);
if (searchFrom == -1) {
return false;
}
}
return true;
}
您要查找的是子序列,而不是子字符串 我在以下网站上找到了一个可行的解决方案:
只需删除第一个字符串中您不关心的所有字符,如/和“等等,然后执行st1.contains(st2)是的,当然,我只是想知道是否有一个库或函数在这样做。谢谢,约瑟夫·里尔是正确的,这是一个子序列。请看:谢谢。你能再解释一点吗?我对Java不太熟悉,对你的代码做了一点困惑。如果字符串中的字符在正则表达式中有特殊意义怎么办?@Robert:你能带一些吗示例?@MouseEvent,谢谢它正在工作,也谢谢你的帮助explanation@RobertOops…将在所有地方添加反斜杠。复制其他年龄段的代码可能会侵犯知识产权。@Robert Reference包含文本位置和作者信用,此重新分发符合CC规定的标准。
// Recursive Java program to check if a string
// is subsequence of another string
import java.io.*;
class SubSequence
{
// Returns true if str1[] is a subsequence of str2[]
// m is length of str1 and n is length of str2
static boolean isSubSequence(String str1, String str2, int m, int n)
{
// Base Cases
if (m == 0)
return true;
if (n == 0)
return false;
// If last characters of two strings are matching
if (str1.charAt(m-1) == str2.charAt(n-1))
return isSubSequence(str1, str2, m-1, n-1);
// If last characters are not matching
return isSubSequence(str1, str2, m, n-1);
}
// Driver program
public static void main (String[] args)
{
String str1 = "database2.0version25";
String str2 = "database2.0/version\"2-00\"";
int m = str1.length();
int n = str2.length();
boolean res = isSubSequence(str1, str2, m, n);
if(res)
System.out.println("Yes");
else
System.out.println("No");
}
}
// Contributed by Pramod Kumar