2015-09-25 14 views
6

Sto cercando di trovare tutte le occorrenze di una sottostringa in una stringa in Java.Trova tutte le occorrenze della sottostringa nella stringa in Java

Ad esempio: cercando "ababsdfasdfhelloasdf" "asdf" restituirebbe [8,17] poiché ci sono 2 "asdf" s ', uno alla posizione 8 e uno a 17. Searching "aaaaaa" per "aa "restituirebbe [0,1,2,3,4] perché c'è un "aa" alle posizioni 0,1,2,3 e 4.

ho provato questo:

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

questo il problema può essere risolto in Python come segue:

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

dove "parola" è la parola che sto cercando e "a" è la stringa che sto cercando.

Come posso ottenere questo in Java?

+0

penso che l'alberino superiore [qui] (http://stackoverflow.com/questions/767759/occurrences-of-substring-in-a-string) può aiutare. Per ottenere gli indici, basta stampare o salvare il 'lastIndex' mentre li ricevi. –

+2

Vuoi dire che hai bisogno [di qualcosa di simile] (http://ideone.com/9IeCEQ)? –

+1

Utilizzare nomi di variabili più significativi. È difficile capire cosa significhi 'cthing1' o' outthing' o 'niwords'. Usare cose come 'lastIndex',' indexList', ecc. Renderà più facile capire cosa hai scritto e correggerlo. – RealSkeptic

risposta

5

È possibile utilizzare l'acquisizione di un look-ahead positivo per ottenere tutte le corrispondenze sovrapposte e utilizzare Matcher#start per ottenere gli indici delle sottostringhe catturate.

Per quanto riguarda the regex, che sarà simile

(?=(aa)) 

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

Risultato:

[0, 1, 2, 3, 4] 

Vedi IDEONE demo

0

L'uso di un'espressione regolare è sicuramente una soluzione eccessivamente pesante per la ricerca di sottostringhe e sarà soprattutto un problema se la sottostringa contiene caratteri regolari speciali come .. Ecco una soluzione adattata da this answer:

String str = "helloslkhellodjladfjhello"; 
String findStr = "hello"; 
int lastIndex = 0; 
List<Integer> result = new ArrayList<Integer>(); 

while(lastIndex != -1) { 

    lastIndex = str.indexOf(findStr,lastIndex); 

    if(lastIndex != -1){ 
     result.add(lastIndex); 
     lastIndex += 1; 
    } 
} 
+0

Restituisce [0,2,4] per "aa" NON [0,1,2,3,4] come richiesto dal poster. È necessario incrementare lastIndex solo di 1 non lunghezza di findStr per trovare tutte le corrispondenze secondarie. – JasonM1

+0

Hai ragione, hai dimenticato la parte che si sovrappone. La modifica. –