2016-07-06 13 views
5

Ich habe eine ArrayList<String>, die ich durchlaufen, um den richtigen Index für einen String zu finden. Grundsätzlich sollte das Programm bei einem String die Liste durchsuchen und den Index finden, in dem das ganze Wort übereinstimmt. Zum Beispiel:Java Spiel ganze Wort in String

ArrayList<String> foo = new ArrayList<String>(); 
foo.add("AAAB_11232016.txt"); 
foo.add("BBB_12252016.txt"); 
foo.add("AAA_09212017.txt"); 

Also, wenn ich den String AAA, gebe ich soll 2 (die letzten) zurück Index. Daher kann ich die Methode nicht verwenden, da dies den Index 0 zurückgibt.

habe ich versucht, mit diesem Code:

String str = "AAA"; 
String pattern = "\\b" + str + "\\b"; 
Pattern p = Pattern.compile(pattern); 

for(int i = 0; i < foo.size(); i++) { 
    // Check each entry of list to find the correct value 
    Matcher match = p.matcher(foo.get(i)); 

    if(match.find() == true) { 
     return i; 
    } 
} 

Leider ist dieser Code nie erreicht die if Anweisung innerhalb der Schleife. Ich bin mir nicht sicher, was ich falsch mache.

Hinweis: Dies sollte auch funktionieren, wenn ich nach AAA_0921, den vollständigen Namen AAA_09212017.txt oder einen Teil der Zeichenfolge, die es eindeutig ist suchen.

+2

'Siehe _' ein Wort betrachtet wird character..so es wird nicht als Wortgrenze handeln .. – rock321987

+0

Ooh, ich das nicht wusste. Ich werde in einen anderen Ausdruck schauen. – syy

+0

Meinst du nicht 'Rückkehr i;'? – 4castle

Antwort

5

Da Wortgrenze nicht zwischen einem Wort char überein und unterstreichen Sie

String pattern = "(?<=_|\\b)" + str + "(?=_|\\b)"; 

brauchen ein Hier (?<=_|\b) positive Lookbehind erfordert eine Wortgrenze oder einen Unterstrich erscheinen vor dem str und die (?=_|\b) positive Vorschau erfordert Unterstrich oder eine Wortgrenze, um direkt nach der str erscheinen.

Siehe this regex demo.

Wenn Ihr Wort Sonderzeichen im Innern hat, könnten Sie eine Straight-Forward-Wortgrenze verwenden mögen:

"(?<![^\\W_])" + Pattern.quote(str) + "(?![^\\W_])" 

Hier die negative Lookbehind (?<![^\\W_]) nicht das Spiel, wenn es ein Wort Zeichen außer einem ist Unterstrich ([^...] ist eine negierte Zeichenklasse, die mit einem anderen Zeichen als den in dieser Klasse definierten Zeichen, Bereichen usw. übereinstimmt, also mit allen Zeichen außer einem Nicht-Wortzeichen \W und einem _ übereinstimmt) und dem negativen Lookahead (?![^\W_]) schlägt die Übereinstimmung fehl, wenn ein Wortzeichen mit Ausnahme des Unterstrichs nach str vorhanden ist.

Beachten Sie, dass das zweite Beispiel eine in Anführungszeichen gesetzte Suchzeichenfolge enthält, so dass auch AA.A_str.txt gut mit AA.A übereinstimmen konnte.

another regex demo

+0

Vielen Dank! Das hat es funktioniert. Kannst du die verschiedenen Teile des Ausdrucks erklären? Ich bin ziemlich neu in 'Regex'. Wenn nicht, ist das in Ordnung, ich kann es nachschlagen. – syy

+1

@Flow Ein großartiges Werkzeug ist [regex101.com] (http://www.regex101.com). Wenn Sie in der oberen rechten Ecke nachsehen, erklärt es die Regex, die Sie ihm geben. Zugegeben, es unterstützt keine Java Regex, aber es ist normalerweise nah genug an PCRE. – 4castle

+2

Ich kämpfe mit meinem Sohn für den Laptop im Zugabteil, und ich werde natürlich versuchen :) –