如果我有
String x = "test";
String s = "tastaegasghet;
你可以在字符串s中找到它。使用已知字符串执行此操作的天真方式将是这样的:
.*t+.*e+.*s+.*t+.*
如果我们能按顺序找到字母 t e s t 并且中间有任何字符,则返回true。我想做同样的事情,但有两个未知的字符串x和s或其他字,字符串s和x可以是任何东西。我不想要硬编码的东西,而是需要通用的东西。
答案 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");
}