2017-11-29 2 views
0

Ich habe die folgende Java-Funktion. Was wir suchen, ist das erste Auftreten aus der Liste listToSearchFor in der Name.Java RegEx das erste Vorkommen von RegEx-Muster in der Input-String finden

Wir wollen JR als die Ausgabe erhalten, da es zuerst in der Array-Liste erscheint.

Wir bekommen SR (wie dies wie RegEx arbeitet)

Im Grunde, was Ehrfurcht versuchen, wenn wir durchqueren die Arraylist von links-> Right jedes Element zu nehmen und eine Suche in der gegebenen tun Eingabe, falls Übereinstimmung gefunden wurde, weiterfahren. Rechts

public static String findTheFirstOccurenceFromTheList() { 
    String name = "CHRIS SR (A BAD BOY Parenthesis) DAVID JR CARNER"; 
    public static List<String> listToSearchFor = Arrays.asList(" I ", " JR ", " SR ", " III ", " II ", " IV ", "2ND ", "3RD ", "4TH ", "5TH ", "6TH ", "7TH ", "8TH ", "9TH "); 
    String suffix = null; 
    int startPos = 0; 
    int endPos = 0; 
    Pattern pattern = Pattern.compile(listToSearchFor.stream().map(String::valueOf).map(Pattern::quote).collect(Collectors.joining("|"))); 
    Matcher match = pattern.matcher(name); 

    while (match.find()) { 
     suffix = match.group(); 
     startPos = match.start(); 
     endPos = match.end(); 
     break; 
    } 
    return suffix; 
}  
+0

Von Mustervergleich wir verstehen, dass die Reihenfolge von links-> ist Warum wird die Ausgabe 'JR' erwartet, wenn' SR' ebenfalls eine erwartete Übereinstimmung ist? – anubhava

+1

'while (bool) {Anweisungen; break;}' sieht so aus, als ob es sehr ähnlich zu 'if (bool) {Anweisungen;} 'ist. Warum verwenden Sie eine while-Schleife als if-Anweisung? – phflack

+0

Sind Sie gezwungen, Regexes dafür zu verwenden? Es ist nicht wirklich, wofür sie bestimmt sind, aber sie können anstelle von 'String.contains (String)' – phflack

Antwort

0

Wenn Sie nicht gezwungen sind, auf einen regulären Ausdruck zu verwenden, eine einfache enthält Schleife arbeiten kann

String findFirstTitleInList(String searchString, List<String> titles) 
{ 
    for(int i = 0; i < titles.size(); i++) //foreach loop might not be ordered on List 
     if(searchString.contains(titles.get(i))) 
      return titles.get(i); 

    //does not contain 
    return null; 
} 
+0

verwendet werden Ich bin nicht auf Regex beschränkt. Nur neugierig, ob es einen Weg gibt. Aber jetzt gehe ich mit dieser Option. – Kotha

Verwandte Themen