Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find all occurrences of substring in string in Java

I'm trying to find all occurrences of a substring in a string in Java.

For example: searching "ababsdfasdfhelloasdf" for "asdf" would return [8,17] since there are 2 "asdf"'s, one at position 8 and one at 17. Searching "aaaaaa" for "aa" would return [0,1,2,3,4] because there is an "aa" at positions 0,1,2,3, and 4.

I tried this:

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

This problem can be solved in Python as follows:

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

where "word" is the word I'm looking for and "a" is the string I'm searching through.

How can I achieve this in Java?

like image 560
Kevin Avatar asked Sep 25 '15 18:09

Kevin


People also ask

How do you find the occurrence of all characters in a string in Java?

Declare a Hashmap in Java of {char, int}. Traverse in the string, check if the Hashmap already contains the traversed character or not. If it is present, then increase its count using get() and put() function in Hashmap. Once the traversal is completed, traverse in the Hashmap and print the character and its frequency.


1 Answers

You can use capturing inside a positive look-ahead to get all overlapping matches and use Matcher#start to get the indices of the captured substrings.

As for the regex, it will look like

(?=(aa))

In Java code:

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

Result:

[0, 1, 2, 3, 4]

See IDEONE demo

like image 165
Wiktor Stribiżew Avatar answered Sep 22 '22 16:09

Wiktor Stribiżew