2013-03-19 5 views
0

Je suis en train de compter le nombre d'URL dans une chaîne Java:Java URL regex ne correspond pas à

String test = "This http://example.com is a sentence https://secure.whatever.org that contains 2 URLs."; 
String urlRegex = "<\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; 
int numUrls = 0; 
pattern = Pattern.compile(urlRegex); 
matcher = pattern.matcher(test); 
while(matcher.find()) 
    numUrls++; 
System.err.println("numUrls = " + numUrls); 

Quand je lance cela, il me dit que j'ai zéro (pas 2) URL dans la chaîne. Une quelconque idée du pourquoi? Merci d'avance!

+0

que font les '<' and '>'. ressemble à des délimiteurs dupliqués – user1937198

+1

Je suis juste curieux, pourquoi vous posez des questions de différents comptes Mike: http://stackoverflow.com/q/15507679/1393766? Peur de dupliquer à proximité? :) – Pshemo

+0

@Pshemo - DirtyMike est mon frère jumeau. Nous travaillons ensemble sur un projet et n'avons accès qu'à un PC avec accès à Internet. Il pose ses questions en DirtyMike, je pose mes questions en tant que TicketMonster. :-) –

Répondre

5

Les < et > personnages urlRegex provoquent un décalage entre votre modèle et votre entrée testString. En les supprimant, vous obtiendrez une valeur numUrls de 2 comme prévu.

0

Essayez ce code:

 String data = "This http://example.com is a sentence https://secure.whatever.org that contains 2 URLs."; 

    Pattern pattern = Pattern.compile("[hH][tT]{2}[Pp][sS]?://(\\w+(\\.\\w+?)?)+"); 
    Matcher matcher = pattern.matcher(data); 

    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 

Espérons que cela fonctionnera.

+0

Si vous voulez rendre insensible à la casse de regex, compilez juste comme suit: Pattern.compile ("un motif", Pattern.CASE_INSENSITIVE) ', ou ajoutez' (? I) 'au début de regex:' Pattern.compile ("(? i) un motif") '. – Pshemo

+0

@Pshemo: Merci pour l'information. J'avais déjà utilisé Pattern.CASE_INSENSITIVE mais je ne connaissais pas (? I). Encore merci. :-) –