Java中的indexOf方法如何查找字符串中多个匹配项?

29

关于indexOf方法,我有一个问题。我想在一个字符串中找到多个"X"的情况。

假设我的字符串是"x is x is x is x",我想找到所有x的索引位置。 但如何处理多个实例?使用indexOf方法是否可行?

我尝试过 int temp = str.indexOf('x'),它可以找到第一个x。我尝试使用for循环,其中i初始化为字符串长度,但这并不起作用,因为我一遍又一遍地找到了第一个x。

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

但是这并不起作用。我应该使用正则表达式吗?因为我不太知道如何使用正则表达式方法。

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

5个回答

52

还有一个与indexOf方法相关的变体,它接受一个起始索引作为参数。

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

2
啊,非常感谢大家。这很有道理,因为您只需根据上次匹配的位置迭代字符串即可。 - Eric

12

5

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


3

这里是使用Streams API的解决方案:

String text = "Lets search for E ?";

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

输出结果将会像这样:
//1
//6

如果您想在结果中添加大写字母,则需要更改filter的参数闭包为:

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

那么输出将会像这样:
//1
//6
//16

此外,如果您只想使用结果或将其打印出来进行快速测试,您可以使用forEach终端操作:
IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .forEach(System.out::println);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接