2011-09-06 2 views
0

Comment puis-je modifier le code suivant afin qu'il ne se soucie pas de cas?Comment puis-je modifier la recherche Regex dans java pour ignorer le cas

public static String tagValue(String inHTML, String tag) 
      throws DataNotFoundException { 
     String value = null; 
     Matcher m = null; 

     int count = 0; 
     try { 

     String searchFor = "<" + tag + ">(.*?)</" + tag + ">"; 

     Pattern pattern = Pattern.compile(searchFor); 

     m = pattern.matcher(inHTML); 


      while (m.find()) { 
       count++; 


       return inHTML.substring(m.start(), m.end()); 
       // System.out.println(inHTML.substring(m.start(), m.end())); 
      } 
     } catch (Exception e) { 
      throw new DataNotFoundException("Can't Find " + tag + "Tag."); 
     } 

     if (count == 0) { 
      throw new DataNotFoundException("Can't Find " + tag + "Tag."); 

     } 

     return inHTML.substring(m.start(), m.end()); 

    } 
+0

http://stackoverflow.com/questions/1102077/how-to-change-this-regular-expression-to-be-case-insenstive-looking-for-src-tag – Mat

Répondre

1

D'abord, lisez Using regular expressions to parse HTML: why not?

Pour répondre à votre question si, en général, vous pouvez simplement mettre (?i) au début de l'expression régulière:

String searchFor = "(?i)" + "<" + tag + ">(.*?)</" + tag + ">"; 

Le Pattern Javadoc explique

La correspondance insensible à la casse peut également être activée via le expression de drapeau incorporée (?i).

Puisque vous utilisez Pattern.compile vous pouvez aussi simplement passer le drapeau CASE_INSENSITIVE:

String searchFor = "<" + tag + ">(.*?)</" + tag + ">"; 

Pattern pattern = Pattern.compile(searchFor, Pattern.CASE_INSENSITIVE); 

Vous devez savoir ce que signifie la casse en Java des expressions régulières. Par défaut, la correspondance insensible à la casse suppose que seuls les caractères du jeu de caractères US-ASCII sont mis en correspondance. La correspondance insensible à la casse prenant en charge Unicode peut être activée en spécifiant l'indicateur UNICODE_CASE en conjonction avec cet indicateur. Il semble que vous correspondiez à des balises, donc vous voulez seulement US-ASCII.

+0

Merci d'avoir attrapé le drapeau 'UNICODE_CASE'; veuillez toujours l'oublier. En rétrospective, il aurait peut-être mieux valu que les drapeaux aient été nommés respectivement ASCII_CASE_INSENSITIVE et UNICODE_SIMPLE_CASE_INSENSITIVE, laissant ainsi la porte ouverte à UNICODE_FULL_CASE_INSENSITIVE pour le moment où le moteur est mis à jour pour faire le pliage complet au lieu du simple pliage ça fait maintenant. (Notez que les méthodes 'String' de Java * font * le casemapping complet, contrairement à ses méthodes' Character' qui ne font que le casemapping simple.) – tchrist

+0

@tchrist, Est-ce que la différence entre le plein et le simple serait des choses comme les turques? J'ai oublié la terminologie des spécifications de cas unicode)? –

+0

Non, c'est un boîtier spécifique aux paramètres régionaux. Le casse complet est quand vous pouvez récupérer une chaîne de sortie qui diffère en longueur (par le nombre de points de code) de celle de l'entrée. – tchrist

6

Donnez le Pattern.CASE_INSENSITIVE drapeau Pattern.compile:

String searchFor = "<" + tag + ">(.*?)</" + tag + ">"; 
Pattern pattern = Pattern.compile(searchFor, Pattern.CASE_INSENSITIVE); 
m = pattern.matcher(inHTML); 

(Oh, et considèrent parsing XML/HTMLinstead of using a regular expression to match a nonregular language.)

+1

Cela ne sera pas important pour cet exemple ASCII seulement, mais si vous n'ajoutez pas UNICODE_CASE, vous allez bousiller des choses comme les sigmas grecs, car il y a deux versions en minuscules et une majuscule, et un cas- match insensible de l'un d'eux est nécessaire pour correspondre à tous les trois d'entre eux. – tchrist

1

Vous pouvez également compiler le modèle avec le drapeau insensible à la casse:

Pattern pattern = Pattern.compile(searchFor, Pattern.CASE_INSENSITIVE); 
Questions connexes