2015-07-19 20 views
5

Ich versuche nach einer Zeichenfolge innerhalb einer Datei Inhalt zu suchen, die ich in eine Zeichenfolge bekam.Suchen Sie nach einer bestimmten Zeichenfolge in einer anderen und zählen Sie, wie oft es erscheint

Ich habe versucht Pattern und Matcher, die für diesen Fall verwenden gearbeitet:

Pattern p = Pattern.compile("(</machine>)"); 
Matcher m = p.matcher(text); 
while(m.find()) //if the text "(</machine>)" was found, enter 
{ 
    Counter++; 
} 

return Counter; 

Dann habe ich versucht, den gleichen Code zu verwenden, wie viele Tags Ich habe zu finden:

Pattern tagsP = Pattern.compile("(</"); 
Matcher tagsM = tagsP.matcher(text); 
while(tagsM.find()) //if the text "(</" was found, enter 
{ 
    CounterTags++; 
} 

return CounterTags; 

in diesem Fall war der Rückgabewert immer 0.

+0

Warum funktioniert es nicht? Hat es Ihnen einen falschen positiven Befund gegeben, wo '' ohne '()' übereinstimmen? – nhahtdh

+0

Die Datei, mit der ich arbeite, ist eine XML-Datei. Der Code, den ich hochgeladen habe, ist eine ältere Version meines Codes, Also als ich versuchte, den() String zu finden, hat es funktioniert, , aber als ich versuchte, nur die '(

+0

Wollen Sie die literale Zeichenfolge '()' finden, oder wollen Sie nur '' finden? Wenn es die erste ist, der Code in der Antwort von Ankit nicht Arbeit. – nhahtdh

Antwort

5

Versuchen Sie, den folgenden Code zu verwenden, BTW nicht verwenden Pattern: -

String actualString = "hello hi how(</machine>) are you doing. Again hi (</machine>) friend (</machine>) hope you are (</machine>)doing good."; 
//actualString which you get from file content 
String toMatch = Pattern.quote("(</machine>)");// for coverting to regex literal 
int count = actualString .split(toMatch, -1).length - 1; // split the actualString to array based on toMatch , so final match count should be -1 than array length. 
System.out.println(count); 

Ausgang: - 4

+2

Ihr Code übergibt die Funktion 'toMatch' an' split() ', die eine Regex erwartet. Dies führt zu einem Problem, wenn die Eingabezeichenfolge Meta-Zeichen in Regex-Syntax enthält. Eine andere Sache ist, dass 'split()' standardmäßig leere Strings am Ende des Arrays entfernt, was ein falsches Ergebnis für Strings wie 'ppppp' oder' aapp' ergibt, wenn es durch 'p' geteilt wird. Sie müssen 'split (regex, -1)' aufrufen, um die leeren Zeichenfolgen am Ende beizubehalten. – nhahtdh

+0

@nhahtdh danke für die Erwähnung, fügte hinzu, dass. Es ist immer gut, von Leuten wie dir zu lernen :) –

+1

Sie könnten Regex Meta-Zeichen in 'toMatch' mit' Pattern.quote' entkommen, vorausgesetzt, dass das OP die Anforderung geklärt hat. – nhahtdh

3

Sie können Apache commons-lang util-Bibliothek verwenden, gibt es eine Funktion countMatches genau für Sie:

int count = StringUtils.countMatches(text, "substring"); 

Auch diese Funktion ist null sicher. Ich empfehle Ihnen, Apache commons Bibliotheken zu erkunden, sie bieten viele nützliche gemeinsame util-Methoden.

+0

Kannst du mir die Importlinie geben? –

+1

importieren org.apache.commons.lang3.StringUtils; Sie müssen eine JAR-Bibliothek von https://commons.apache.org/proper/commons-lang/download_lang.cgi herunterladen und sie in den Build-Pfad Ihres Projekts einschließen. Hier ist ein Tutorial: http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-%28Java%29 – Gondy

Verwandte Themen