Java indexOf方法可用于字符串中的多个匹配项

Java indexOf method for multiple matches in String

我对indexOf方法有疑问。 我想在字符串中找到多个" X"的情况。

假设我的字符串是" x是x是x是x",我想在其所有索引位置中找到x。
但是,如何在多种情况下执行此操作? 使用indexOf甚至可能吗?

我做了int temp = str.indexOf('x');
它找到第一个x。 我试图做一个for循环,在此循环中我被初始化为字符串的长度,但是由于我不断发现第一个x,所以这没有用。

1
2
3
4
5
for (int y = temp1; y >= 0;y-- )
{
    int temp = str.indexOf('x');
    System.out.println(temp);
}

但这是行不通的。 我应该使用正则表达式吗? 因为我真的不知道如何使用正则表达式方法。

任何帮助将不胜感激,谢谢!


indexOf方法的第二种变体,它以起始索引为参数。

1
2
3
4
5
i = str.indexOf('x');
while(i >= 0) {
     System.out.println(i);
     i = str.indexOf('x', i+1);
}


indexOf方法的另一个版本,以fromIndex作为参数。
因此,您可以循环调用它,每次将prevPosition + 1作为第二个参数传递。

说明文件:
http://download.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf(int,int)


您可以使用indexOf指定起始索引。因此,在循环中,存储了" x"的最后一个位置,然后使用该索引+ 1再次搜索。


这是Streams API的解决方案:

1
2
3
4
5
6
String text ="Lets search for E ?";

final char key ="e".charAt(0);
int[] indices = IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .toArray();

输出将是这样的:

1
2
//1
//6

如果要在结果中添加大写字母,则需要使用以下命令更改filter的参数闭包:

1
.filter(i -> Character.toLowerCase(text.charAt(i)) == key)

然后输出将是这样的:

1
2
3
//1
//6
//16

另外,如果您只想使用结果或将其打印出来以进行快速测试,则可以使用forEach终端操作来做到这一点:

1
2
3
IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .forEach(System.out::println);

您想要在特定字符串中找到多个字符。是的,你可以这么做。您可以使用indexOf方法的重载版本。网站已详细描述了indexOf方法的所有重载版本。https://www.javaians.com/indexof-java/。您可以阅读有关Java indexOf方法的详细指南。


1
2
3
4
5
6
7
String name ="alameer kaiser aziz";
String found ="a";
int num = name.indexOf(found);
while (num >=0) {
    System.out.println(num);
    num = name.indexOf(found,num+1);
}