2017-06-30 1 views
3

Extrahieren Was ich versuche, ist auf mein Konto-ID von einer URL für andere Validierungen zu extrahieren. siehe meine URL-Beispiele.Regulärer Ausdruck eine Zeichenfolge aus url

http://localhost:8024/accounts/u8m21ercgelj/ 
http://localhost:8024/accounts/u8m21ercgelj 
http://localhost:8024/accounts/u8m21ercgelj/users? 

Was ich erforderlich ist aus der URL zu extrahieren u8m21ercgelj. Ich versuchte es mit folgendem Code aber es funktioniert nicht für die Fälle, wie http://localhost:8024/accounts/u8m21ercgelj d.h mit out a/am Ende.

public String extractAccountIdFromURL(String url) { 
     String accountId = null; 
     if (url.contains("accounts")) { 
      Pattern pattern = Pattern.compile("[accounts]/(.*?)/"); 
      Matcher matcher = pattern.matcher(url); 
      while (matcher.find()) { 

       accountId = matcher.group(1); 
      } 
     } 
     return accountId; 
    } 

Kann mir jemand helfen?

Antwort

3
  1. [accounts] nicht accounts Wort zu finden, nicht versuchen, aber ein Zeichen, das entweder a, c (Wiederholung des Charakters ändert nichts), o, u, n, t oder s, weil [...]character class ist. So erhalten von denen befreien [ und ] und ersetzen sie durch / da Sie wahrscheinlich nicht wollen, Fälle wie /specialaccounts/ akzeptieren, aber nur /accounts/.

  2. Es sieht aus wie Sie gerade neben nicht/Abschnitt nach /accounts/ finden möchten. In diesem Fall können Sie nur /accounts/([^/]+)

  3. verwenden Wenn Sie sicher sind, dass es nur einen /accounts/ Abschnitt in URL sein können (und für mehr lesbaren Code sollte) Ihre while zu if oder sogar Konditionaloperator ändern. Es ist auch kein contains("/accounts/") erforderlich, da nur zusätzliche Traversierungen über den gesamten String vorgenommen werden, was unter find() möglich ist.

  4. sieht es nicht wie Ihre Methode wird von Ihrer Klasse (alle Felder), so könnte es statisch gehalten keine Daten.

Demo:

//we should resuse once compiled regex, there is no point in compiling it many times 
private static Pattern pattern = Pattern.compile("/accounts/([^/]+)"); 
public static String extractAccountIdFromURL(String url) { 
    Matcher matcher = pattern.matcher(url); 
    return matcher.find() ? matcher.group(1) : null; 
} 

public static void main(java.lang.String[] args) throws Exception { 
    String examples = 
      "http://localhost:8024/accounts/u8m21ercgelj/\r\n" + 
      "http://localhost:8024/accounts/u8m21ercgelj\r\n" + 
      "http://localhost:8024/accounts/u8m21ercgelj/users?"; 
    for (String url : examples.split("\\R")){// split on line separator like `\r\n` 
     System.out.println(extractAccountIdFromURL(url)); 
    } 
} 

Ausgang:

u8m21ercgelj 
u8m21ercgelj 
u8m21ercgelj 
+0

Danke, werde ich meinen Code korrigieren – ANP

+0

Sie sind willkommen. – Pshemo

+0

@ANP Ich wundere mich, warum Sie 'while' anstelle von' if' verwenden. Gehen Sie davon aus, dass es mehr als ein '/ accounts /' in URL geben kann? Wenn nicht, um Leute, die diesen Code pflegen, nicht zu verwirren, sollten Sie ihn in "if" ändern. Aber wenn URL viele '/ accounts /' haben kann, dann kann die gepostete Lösung für Fälle wie '/ accounts/accounts/foo' fehlschlagen (ich könnte versuchen, es zu korrigieren, also lassen Sie mich wissen, wenn eine Korrektur erforderlich ist). – Pshemo

4

Ihre Regex ist so geschrieben, dass sie einen Schrägstrich erwartet - das ist der Schrägstrich nach der (.*?).

Sie sollen dies ändern, so dass sie entweder den Schrägstrich oder das Ende der Zeichenfolge akzeptieren können. (/|$) sollte in diesem Fall arbeiten, wäre Ihre regex Bedeutung [accounts]/(.*?)(/|$)

+0

Thanks @ Daniel, es funktioniert – ANP

Verwandte Themen