java
  • regex
  • 2009-12-29 6 views 1 likes 
    1

    J'ai essayé cela pendant quelques heures et je n'ai pas réussi à le faire correctement; donc je me suis dit que je l'afficherais ici. Voici mon problème.Suppression des URL dans une chaîne java

    d'une chaîne en java:

    "this is <a href='something'>one \nlink</a> some text <a href='fubar'>two \nlink</a> extra text" 
    

    Maintenant, je veux enlever la balise de lien de cette chaîne en utilisant des expressions régulières - de sorte que la chaîne résultante devrait ressembler à:

    "this is one \nlink some text two \nlink extra text" 
    

    Je J'ai essayé toutes sortes de choses dans les expressions régulières java; capturer des groupes, des qualificatifs gourmands - vous l'appelez, et vous n'arrivez toujours pas à le faire fonctionner correctement. S'il n'y a qu'une seule étiquette de lien dans la chaîne, je peux la faire fonctionner facilement. Cependant, ma chaîne peut contenir plusieurs URL, ce qui empêche mon expression de fonctionner. Voici ce que j'ai jusqu'à présent - (?s).*(<a.*>(.*)</a>).*

    Notez que la chaîne à l'intérieur du lien peut être de longueur variable, c'est pourquoi j'ai le. * Dans l'expression.

    Si quelqu'un peut me donner une expression régulière qui fonctionnera, je serai extrêmement reconnaissant. Court de boucler à travers chaque caractère et en supprimant les liens je ne peux pas trouver une solution.

    +0

    Si vous voulez suivre les normes, (X) attributs HTML sont entourés par des guillemets doubles ('" '), pas de guillemets simples ('' '). –

    Répondre

    3

    Parfois, il est plus facile de le faire en 2 étapes:

    s = "this is <a href='something'>one \nlink</a> some text <a href='fubar'>two \nlink</a> extra text" 
    s.replaceAll("<a[^>]*>", "").replaceAll("</a>", "") 
    Result: "this is one \nlink some text two \nlink extra text" 
    
    1

    Du haut de ma tête

    "<a [^>]*>|</a>" 
    
    2

    est ici la façon dont je correspondent habituellement tags:

    <a .*?>|</a> 
    

    et le remplacer par une chaîne vide.

    Alternativement, au lieu de retirer l'étiquette, vous pourriez le commenter. Le schéma de correspondance serait le même, mais le remplacement serait:

    <!--\0--> 
    

    ou

    <!--$0--> 
    

    Si vous voulez avoir une référence au texte d'ancrage, utilisez ce modèle de match:

    <a .*?>(.*?)</a> 
    

    et le remplacement serait un indice de 1 au lieu de 0.

    Remarque: Parfois, vous devez utiliser des indicateurs spécifiques au langage de programmation pour permettre à regex de correspondre sur plusieurs lignes (correspondance de motif multi-lignes). Voici un Java Exemple

    Pattern aPattern = Pattern.compile(regexString,Pattern.MULTILINE); 
    
    Questions connexes