2015-09-07 2 views
-2

à partir du script html suivant:Regex, Comment extraire une chaîne délimitée et contenant des mots spéciaux?

<p style="line-height:0;text-align:left"> 
    <font face="Arial"> 
     <span style="font-size:10pt;line-height:15px;"> 
      <br /> 
     </span> 
    </font> 
</p> 
<p style="line-height:0;text-align:left"> 
    <font face="AR BLANCA"> 
     <span style="font-size:20pt;line-height:30px;"> 
      [designation] 
     </span> 
    </font> 
</p> 
<p style="line-height:0;text-align:left"> 
    &nbsp;&nbsp; 
</p> 

Je veux extraire la partie suivante

<font face="AR BLANCA"> 
    <span style="font-size:20pt;line-height:30px;"> 
     [désignation] 
    </span> 
</font> 

J'ai essayé cette expression régulière:

<font.*?font> 

cela pourrait extraire séparemment deux matches, mais comment spécifier que je veux ce qui contient []? Merci

+1

obligatoire: http://stackoverflow.com/a/1732454/2846923 –

+0

Quelle langue/programme voulez-vous utiliser le regex dans? –

+0

C#. Je ne pense pas que je puisse trouver un autre moyen de résoudre mon problème sans regex –

Répondre

-2

En général, vous ne devriez pas utiliser les regexes pour HTML - il y a généralement beaucoup de meilleures façons de le faire. Cependant, dans certains cas isolés, cela fonctionne parfaitement bien. En supposant que c'est l'un de ces cas, voici comment le faire avec regex.


Faire regexes est souvent facile quand vous pensez de cette façon: écrivez ce que vous voulez faire correspondre, puis remplacer les parties de celui-ci avec regex si nécessaire.

Nous voulons correspondre

<font face="AR BLANCA"> 
    <span style="font-size:20pt;line-height:30px;"> 
     [désignation] 
    </span> 
</font> 

Nous ne nous soucions pas ce face="AR BLANCA"> <span style="font-size:20pt;line-height:30px;">, désignation et </span> sont, afin de les remplacer par .*.

<font .*[.*].*</font> 

Nous avons également vous assurer que vous échapper à tous les caractères spéciaux, sinon [.*] sera pris pour un character class.

<font .*\[.*\].*</font> 

Nous voulons aussi correspondre tous caractères, mais la plupart du temps un . correspond uniquement caractères non-retour à la ligne. [\S\s] est une classe de caractères qui correspond par définition à tous caractères.

<font [\S\s]*\[[\S\s]*\][\S\s]*</font> 

Nous avons enfin un dernier problème de cette expression rationnelle correspond à de la première à la dernière <font</font>. Avec votre exemple HTML, rendre le quantificateur paresseux ne l'aidera pas, nous devons donc faire autre chose. La meilleure façon de faire cela que je sache est d'utiliser le truc expliqué here. Nous remplaçons donc chaque instance de [\S\s]* par ((?!</?font)[\S\s])*.

<font ((?!</?font)[\S\s])*\[((?!</?font)[\S\s])*\]((?!</?font)[\S\s])*</font> 

Here's an online demonstration of this regex.

+0

A fonctionné parfaitement. Merci monsieur Hat :) –

0

La manière avec Html Agility Pack:

using HtmlAgilityPack; 
... 

string htmlText = @"<p style=""line-height:0;text-align:left""> 
..."; 

HtmlDocument html = new HtmlDocument(); 
html.LoadHtml(htmlText); 
HtmlNode doc = html.DocumentNode; 

HtmlNodeCollection nodes = doc.SelectNodes("//font[.//text()[contains(substring-after(., '['), ']')]]"); 

if (nodes != null) 
{ 
    foreach (HtmlNode node in nodes) 
    { 
     Console.WriteLine(node.OuterHtml); 
    } 
}