2016-03-18 1 views
0

Je souhaite trouver une seule expression régulière correspondant à la plus longue chaîne numérique d'une URL. i.e. pour l'URL: http://stackoverflow.com/1234/questions/123456789/ask, je voudrais revenir à: 123456789Recherche de la plus longue "séquence numérique" dans une chaîne en utilisant une seule expression rationnelle

Je pensais que je pouvais utiliser: ([\d]+)

Cependant ce retourne le premier match de la gauche, pas la plus longue. Des idées :)?


Ce regex sera utilisé comme une entrée à un modèle de stratégie, qui extrait certaines caractéristiques de urls:

public static String parse(String url, String RegEx) { 

    Pattern pattern = Pattern.compile(regex); 
    Matcher m = pattern.matcher(url); 
    if (m.find()) { 
    return m.group(1); 
    } 

return null; 

}

Il serait beaucoup plus net si je pouvais utiliser un regex simple. :(-

+0

Ceci est tout simplement pas possible sans modifications/meilleures spécifications en une seule regex. Vous aurez besoin d'une logique de programmation supplémentaire. Période. – Jan

+0

Obtenez toutes les correspondances basées sur '\ b \ d + \ b' et parcourez les correspondances pour trouver la plus longue longueur – anubhava

+0

De plus, aucune parenthèse n'est nécessaire dans ce cas, vous pouvez très bien écrire' \ d + 'sans aucune parenthèse. – Jan

Répondre

0

Ne pas utiliser regex Juste itérer les personnages:

String longest = 0; 
int i = 0; 
while (i < str.length()) { 
    while (i < str.length() && !Character.isDigit(str.charAt(i))) { 
    ++i; 
    } 
    int start = i; 
    while (i < str.length() && Character.isDigit(str.charAt(i))) { 
    ++i; 
    } 
    if (i - start > longest.length()) { 
    longest = str.substring(start, i); 
    } 
} 
0

@Andy déjà donné une réponse non-regex, ce qui est probablement plus rapide, mais si vous voulez utiliser regex, vous devez. , comme @Jan souligne, ajouter une logique, par exemple:

public String findLongestNumber(String input) { 
    String longestMatch = ""; 
    int maxLength = 0; 
    Matcher m = Pattern.compile("([\\d]+)").matcher(input); 
    while (m.find()) { 
     String currentMatch = m.group(); 
     int currentLength = currentMatch.length(); 
     if (currentLength > maxLength) { 
      maxLength = currentLength; 
      longestMatch = currentMatch; 
     } 

    } 

    return longestMatch; 
} 

t

0

Pas possible avec Regex pur, mais je le ferais de cette façon (en utilisant flux Max et Regex):

String url = "http://stackoverflow.com/1234/questions/123456789/ask"; 
    Pattern biggest = Pattern.compile("/(\\d+)/"); 
    Matcher m = biggest.matcher(url); 
    List<String> matches = new ArrayList<>(); 
    while(m.find()){ 
     matches.add(m.group(1)); 
    } 
    System.out.println(matches.parallelStream().max((String a, String b) -> Integer.compare(a.length(), b.length())).get()); 

imprimera: 123456789