当前位置: 首页 > 面试题库 >

查找Java中字符串中所有出现的子字符串

郤玉书
2023-03-14
问题内容

我正在尝试查找Java字符串中所有出现的子字符串。

例如:在“ ababsdfasdfhelloasdf”中搜索“ asdf”将返回[8,17],因为有2个“ asdf”,一个在位置8,另一个在17。在“
aaaaaa”中搜索“ aa”将返回[0, 1,2,3,4],因为位置0、1、2、3和4处有一个“ aa”。

我尝试了这个:

public List<Integer> findSubstrings(String inwords, String inword) {
    String copyOfWords = inwords;
    List<Integer> indicesOfWord = new ArrayList<Integer>();
    int currentStartIndex = niwords.indexOf(inword);
    int indexat = 0;
    System.out.println(currentStartIndex);
    while (cthing1 > 0) {
        indicesOfWord.add(currentStartIndex+indexat);
        System.out.println(currentStartIndex);
        System.out.println(indicesOfWord);
        indexat += cthing1;
        copyOfWords = copyOfWords.substring(cthing1);
        System.out.println(copyOfWords);
        cthing1 = copyOfWords.indexOf(inword);
    }

可以在Python中解决此问题,如下所示:

indices = [m.start() for m in re.finditer(word, a.lower())]

其中“ word”是我要搜​​索的单词,“ a”是我要搜​​索的字符串。

如何用Java实现呢?


问题答案:

您可以在正向前瞻中使用捕获功能来获取所有重叠的匹配项,并用于Matcher#start获取捕获的子字符串的索引

至于正则表达式,它将看起来像

(?=(aa))

在Java代码中:

String s = "aaaaaa";
Matcher m = Pattern.compile("(?=(aa))").matcher(s);
List<Integer> pos = new ArrayList<Integer>();
while (m.find())
{
    pos.add(m.start());
}
System.out.println(pos);

结果:

[0, 1, 2, 3, 4]

见IDEONE演示



 类似资料:
  • 问题内容: 我需要解析一个HTML文档并查找其中所有出现的字符串。 我目前将HTML加载到字符串变量中。我只需要字符位置,这样我就可以遍历列表以在字符串之后返回一些数据。 该函数仅返回第 一个 匹配项。如何 全部 归还呢? 问题答案: 在不使用正则表达式的情况下,类似这样的方法应该可以返回字符串位置:

  • 问题内容: 我正在尝试查找“ |”的所有出现 在一个字符串中。 但我得到一个错误: 问题答案: 功能: 将返回的索引列表中的出现。

  • 问题内容: 我想计算一个字符串中某个字符的出现次数,假设我有一个字符串“ aaaab”,我如何计算其中的a数量? 问题答案: 如果不使用正则表达式,则代码看起来更易于阅读。 现在在您的字符串中包含数字“ a”。并且,这在最佳时间执行。 正则表达式非常适合模式匹配。但是只需定期循环即可在此处完成工作。

  • 问题内容: 我正在尝试从Java字符串中找到所有三个字母子字符串。 例如,从字符串“ example string”中,我应该得到“ exa”,“ xam”,“ amp”,“ mpl”,“ ple”,“ str”,“ tri”,“ rin”,“ ing”。 我尝试使用Java正则表达式“([[a-zA-Z]){3}”,但仅得到“ exa”,“ mpl”,“ str”,“ ing”。 有人可以告诉我

  • 问题内容: 给我们一个字符串,说一个子字符串,说。我需要找到字符串在原始字符串中第二次出现时的索引。 在这种情况下将返回2。在这种情况下,我希望输出为10。 问题答案: 使用的重载版本,它将起始索引(fromIndex)作为第二个参数:

  • 我们得到一个字符串,比如说< code >“it whatis”,以及一个子字符串,比如说< code >“is”。当字符串< code >“is”在原始字符串中第二次出现时,我需要找到< code >“I”的索引。 在这种情况下将返回2。我希望在这种情况下输出为10。