java,如何确定字符串是否包含特定顺序的子字符串

时间:2017-11-28 19:19:59

标签: 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。

3 个答案:

答案 0 :(得分:2)

试试这个:

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 - 硬编码 - 您可以自动执行此操作),在前后添加.*以及在每个字符之间添加.* 。 (String.chars()匹配任何字符的0或更多)。

  • IntStream返回String,将其转换为 var backButtonImage: UIImage = UIImage(named: "backButton")! UINavigationBar.appearance().backIndicatorImage = backButtonImage UINavigationBar.appearance().backIndicatorTransitionMaskImage = backButtonImage if #available(iOS 11, *) { UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-300, 0), for:UIBarMetrics.default) } else { UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -200), for:UIBarMetrics.default) } ,类型为

  • 正如@Robert建议的那样,用反斜杠转义特殊字符。

  • 检查较长的字符串匹配,这有效意味着它包含短字符串的所有字符,可能还有更多。

答案 1 :(得分:0)

您可以按顺序查找needle个字符,在字符串haystack中找到子序列needle,从您找到的索引searchFrom开始每个连续的角色。

在以下代码中,请注意haystack.indexOf(needleChar, searchFrom)needleChar中的索引searchFrom开始返回第一次出现haystack的索引。

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;
}

答案 2 :(得分:0)

您要找的是子序列,而不是子串

这是我在geeksforgeeks上找到的工作解决方案:

// 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