2016-04-22 36 views
2

Gibt es eine Möglichkeit, zu überprüfen, ob eine Teilzeichenfolge ein vollständiges WORD und keine Teilzeichenfolge enthält.Überprüfen, ob die Zeichenfolge ein Wort enthält (keine Teilzeichenfolge!)

Envision das folgende Szenario:

public class Test { 
    public static void main(String[] args) { 
     String[] text = {"this is a", "banana"}; 
     String search = "a"; 

     int counter = 0; 
     for(int i = 0; i < text.length; i++) { 
      if(text[i].toLowerCase().contains(search)) { 
       counter++; 
      } 
     } 

     System.out.println("Counter was " + counter); 
    } 
} 

Dies wertet zu

Counter was 2 

Welche nicht das, was ich suche, wie es nur eine Instanz des Wortes ist ‚a‘ in der Array.

So wie ich es lesen, ist wie folgt:

Die if-Test ein 'a' in Text findet [0], das 'a' entspricht, "das ist [a]". Es findet jedoch auch das Vorkommen von "a" in "Banane" und erhöht somit den Zähler.

Wie kann ich dies lösen, um nur das Wort 'a', und nicht Teilstrings mit einem?

Danke!

+0

Überprüfen Sie meine Antwort –

Antwort

5

Sie einen regulären Ausdruck verwenden könnte, Pattern.quote mit Sonderzeichen entrinnen.

String regex = ".*\\b" + Pattern.quote(search) + "\\b.*"; // \b is a word boundary 

int counter = 0; 
for(int i = 0; i < text.length; i++) { 
    if(text[i].toLowerCase().matches(regex)) { 
     counter++; 
    } 
} 

Hinweis: Das wird auch "a" in "this is a; pause" oder "Looking for an a?" finden, wo a keinen Platz, nachdem es hat.

+2

'verwenden können Wenn (text [i] .toLowerCase(). (regex) übereinstimmt) {' – Nirekin

+0

@Guillaume danke. –

+0

Danke! Allerdings bekomme ich die Nachricht "die Methode quote (String) ist nicht definiert für Typ Muster"). – northerner

-1

Wenn die Wörter durch ein Leerzeichen getrennt sind, dann können Sie tun:

if((" "+text[i].toLowerCase()+" ").contains(" "+search+" ")) 
{ 
    ... 
} 

Dies fügt zwei Räume auf den ursprünglichen String.
zB "this is a" wird " this is a ".

Dann sucht es nach dem Wort mit den flankierenden Leerzeichen. zB: Es sucht nach " a " wenn search ist "a"

+0

was ist, wenn das a am Anfang oder am Ende ist? – Nadir

+1

@Nadir Genau deshalb fügen wir Räume hinzu! – Hackerdarshi

+0

@Nadir Siehe dies: ** "" ** + text [i] .toLowerCase() + ** "" ** – Hackerdarshi

1

konnte auf diese Weise versuchen:

for(int i = 0; i < text.length; i++) { 
    String[] words = text[i].split("\\s+"); 
    for (String word : words) 
     if(word.equalsIgnoreCase(search)) { 
      counter++; 
      break; 
     } 
} 
0
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count(); 
0

Natürlich, wie andere geschrieben haben, können Sie mit allen Arten von Muster zu Spiel „Wörter“ aus „text“ Herumspielen starten.

Aber die Sache ist: abhängig von dem zugrunde liegenden Problem, das Sie lösen müssen, könnte dies (bei weitem) nicht gut genug. Bedeutung: Stehen Sie vor dem Problem, ein Muster in einer Zeichenfolge zu finden ... oder möchten Sie diesen Text wirklich im Sinne der "menschlichen Sprache" interpretieren? Weißt du, wenn jemand Text niederschreibt, kann es subtile Tippfehler oder merkwürdige Zeichen geben; alle möglichen Dinge, die es schwierig machen, ein bestimmtes Wort in diesem Text wirklich zu "finden". Es sei denn, Sie tauchen in den Aspekt der "Sprachverarbeitung" ein.

Lange Rede, kurzer Sinn: wenn Ihr Job "bestimmte Muster in Strings findet"; dann werden alle anderen Antworten ausreichen. Aber wenn Ihre Anforderung darüber hinausgeht, wie "einige Menschen werden Ihre Anwendung verwenden, um riesige Datensätze zu durchsuchen"; dann hör jetzt besser auf; und ziehen Sie in Betracht, zu Volltext-fähigen Suchmaschinen wie ElasticSearch oder Solr zu wechseln.

Verwandte Themen