2010-03-10 6 views
0

Je reçois l'erreur de compilation.Comment écrire Java littéraux de chaîne qui contiennent des guillemets doubles («)?

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class gfile 
{ 
    public static void main(String args[]) { 
    // create a Pattern 
    Pattern p = Pattern.compile("<div class="dinner">(.*?)</div>");//some prob with this line 


    // create a Matcher and use the Matcher.group() method 
    String can="<tr>"+ 
          "<td class="summaryinfo">"+ 

           "<div class="dinner">1,000</div>" + 
           "<div style="margin-top:5px " + 
           "font-weight:bold">times</div>"+ 
          "</td>"+ 
         "</tr>"; 

    Matcher matcher = p.matcher(can); 
    // extract the group 

    if(matcher.find()) 
    { 
    System.out.println(matcher.group()); 
    } 
    else 
    System.out.println("could not find"); 
    } 
} 
+2

S'il vous plaît laissez-nous savoir ce que vous attendez qu'il fasse, et de quelle manière il est un échec: ce résultat inattendu que vous voyez. –

+0

Soyez plus précis. Où est-ce "mauvais"? Est-ce qu'il compile? Est-ce que ça plante? Est-ce que cela produit le "mauvais" résultat? – CaffGeek

+8

Quel est le problème, c'est qu'il utilise regex sur html –

Répondre

1

Mais, votre Regex est correspondant (. *) » Tout caractère, un nombre des répétitions, aussi peu que possible »

Signification, elle correspond à rien ... et tout.

... ou le fait que vos citations ne sont pas échappés.

+0

Le (. *?) Est valide. Il correspond à zéro ou plusieurs caractères de n'importe quelle valeur entre les deux donnés

elements. The "?" just makes that non-greedy so it locates the very next '
'. –

-1

(.*?) peut avoir besoin d'être (.*)?

7

Vous avez des guillemets sans échappement dans votre appel à Pattern.compile.

Change:

Pattern p = Pattern.compile("<div class="dinner">(.*?)</div>"); 

Pour:

Pattern p = Pattern.compile("<div class=\"dinner\">(.*?)</div>"); 

Note: Je viens de voir le même problème dans votre chaîne peut.

Modifier à:

String can="<tr>"+ 
         "<td class=\"summaryinfo\">"+ 

          "<div class=\"dinner\">1,000</div>" + 
          "<div style=\"margin-top:5px " + 
          "font-weight:bold\">times</div>"+ 
         "</td>"+ 
        "</tr>"; 

Je ne sais pas si cela résout, mais ce sera au moins compiler maintenant.

0

Vous devez utiliser un analyseur HTML pour analyser et traiter le code HTML - et non une expression régulière.

+0

Si je pouvais voter 100 fois je voudrais – extraneon

+1

Cela ne répond pas à la question. – Gumbo

+0

@allthosequi se plaint des expressions régulières avec HTML, XML, etc. C'est mauvais si vous l'avez déstructuré, et le formatage peut changer. MAIS, si vous connaissez le format, et SAVOIR qu'il n'aura pas de surprises, il n'y a aucune raison de ne pas utiliser un Regex. Juste parce que ce n'est souvent pas le bon cours, ne veut pas dire que ça ne l'est jamais. – CaffGeek

0

Comme déjà souligné, vous aurez besoin d'échapper les guillemets à l'intérieur tous de vos chaînes. Et, si vous voulez avoir "1,000" comme résultat, vous devrez utiliser group(1), sinon vous obtiendrez la correspondance complète du modèle.

code résultant:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class gfile 
{ 
    public static void main(String args[]) { 
    // create a Pattern 
    Pattern p = Pattern.compile("<div class=\"dinner\">(.*?)</div>"); 

    // create a Matcher and use the Matcher.group() method 
    String can="<tr>"+ 
          "<td class=\"summaryinfo\">"+ 

           "<div class=\"dinner\">1,000</div>" + 
           "<div style=\"margin-top:5px " + 
           "font-weight:bold\">times</div>"+ 
          "</td>"+ 
         "</tr>"; 

    Matcher matcher = p.matcher(can); 

    if(matcher.find()) 
    { 
     System.out.println(matcher.group(1)); 
    } 
    else 
     System.out.println("could not find"); 
    } 
} 
+0

Non, vous n'avez pas besoin d'échapper aux chevrons. –

+0

Merci, réparé ... – orithena

Questions connexes