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
中的index
searchFrom
开始

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