比较两个未知字符串并找到匹配

时间:2014-11-04 11:05:37

标签: java regex

如果我有

String x = "test";
String s = "tastaegasghet;

你可以在字符串s中找到它。使用已知字符串执行此操作的天真方式将是这样的:

.*t+.*e+.*s+.*t+.*

如果我们能按顺序找到字母 t e s t 并且中间有任何字符,则返回true。我想做同样的事情,但有两个未知的字符串x和s或其他字,字符串s和x可以是任何东西。我不想要硬编码的东西,而是需要通用的东西。

5 个答案:

答案 0 :(得分:2)

使用循环并不难。

String x = "test";
String s = "tastaegasghet";
int index = 0;
for(int i = 0; i < s.length() && index < x.length(); i++){
    if(s.charAt(i) == x.charAt(index)) index++;
}
boolean exists = index == x.length();
System.out.println(exists);

这应该比正则表达式快得多,至少对于更长的输入来说。

答案 1 :(得分:2)

这是循环解决方案的伪代码:

function (
    needle, // x
    haystack // s
) {
    j = 0
    for (i = 0; i < haystack.length && j < needle.length; i++) {
         if (haystack[i] == needle[j]) {
             j++
         }
    }

    return j == needle.length
}

当您找到匹配的字符时,您只需要遍历haystack字符串中的每个字符并在指针字符串中前进指针。如果指针到达针串的末端,则意味着可以找到针串作为干草堆串的子序列。

您可以做的一个小优化是在开始循环之前检查needle.length <= haystack.length

只是为了好玩

如果你想采用克苏鲁的方式,你可以使用这种结构:

(?>.*?t)(?>.*?e)(?>.*?s)(?>.*?t).*+

这不存在灾难性回溯的风险,并且应该与上面的循环类似(线性复杂度),除了它有很多开销编译和匹配正则表达式。

答案 2 :(得分:0)

我使用循环而不是正则表达式创建一个简单的函数。如下所示:

public boolean containsLetters(string a, string b)
{
    char[] aArray = a.toCharArray();
    char[] bArray = b.toCharArray();
    int lettersFound = 0, lastLocation = 0;
    for (int i = 0; i < aArray.length; i++)
    {
        for (lastLocation=lastLocation; lastLocation < bArray.length; lastLocation++)
        {
            if (aArray[i] == bArray[lastLocation])
            {
                lettersFound++;
                break;
            }
        }
    }
    return lettersFound == aArray.length;
}

内部for循环在第一次找到该字母时停止。由于函数返回一个布尔值,因此需要确定它是否出现多次,因此这为大字符串节省了一些时间。只有按顺序找到它们才会返回true。它会记住它找到的最后一个字母的索引,并搜索该位置的下一个字母。

答案 3 :(得分:-1)

您可以使用Pattern类。

String x= "yourValue";
Pattern pattern = Pattern.compile(Mention your pattern here);
Matcher matcher = pattern.matcher(x);
if (matcher.find()) {
    System.out.println(matcher.group(0)); //prints /{item}/
} else {
    System.out.println("Match not found");
}

答案 4 :(得分:-1)

不使用任何内置函数的Java代码

    String s1 = "test";
    String s2 = "tastaegasghets";
    char ch[] = new char[s1.length()];
    char ch1[] = new char[s2.length()];
    int k = 0;
    for (int i = 0; i < s1.length(); i++) {
        ch[i] = s1.charAt(i);

        for (int j = 0; j < s2.length(); j++) {
            ch1[j] = s2.charAt(j);
            if (ch[i] == ch1[j]) {
                k++;
                break;

            }
        }

    }
    if (k == s1.length()) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }