2014-06-25 4 views
0

J'essaie de faire cela depuis un certain temps maintenant, mais mes compétences en Regex sont plutôt mauvaises. J'ai ce texteMotif regex simple en C#

<td class="red"> 
    One 
</td> 
<td> 
    Two 
</td> 

Et je veux obtenir la valeur de « deux ». J'ai essayé plusieurs choses comme

<td>\n(.*)\n</td> 
<td class=\"red\">\nOne\n</td>\n<td>\n(.*)\n</td> 

Et voici mon C# source de

foreach (Match m in Regex.Matches(src, pattern, RegexOptions.IgnorePatternWhitespace)) 
{ 
    MessageBox.Show(m.Groups[1].Value); 
} 

J'ai essayé de changer le RegexOptions sans chance. Si quelqu'un pouvait m'aider, ce serait grandement apprécié. Merci

+0

classe Utilisez XElement, il est beaucoup plus facile. – CodeWeed

+0

utiliser 'HTML agility pack' il serait beaucoup plus simple plutôt que maintenant –

+0

XElement.Parse (" ). Éléments (" td "). Last(). Valeur – CodeWeed

Répondre

0

Utilisez le modificateur s (dotall) forçant le point . pour correspondre à des séquences de saut de ligne ainsi que.

foreach (Match m in Regex.Matches(src, @"(?s)<td>\s*(.*?)\s*</td>")) 
     MessageBox.Show(m.Groups[1].Value); 

Remarque: Suivez .* avec ? pour un match non gourmand ici.

+0

Cela a fonctionné. Merci beaucoup. J'apprécie beaucoup – user2467120

1

Pourquoi ne pas simplement:

string expression = @"\<td\>[\s]*[A-Za-z]*[\s]*\</td\>"; 

Et si vous voulez le nom de votre groupe

string expression = @"\<td\>[\s]*(?<groupName>([A-Za-z]*))[\s]*\</td\>"; 
0

Activez le modificateur dotall (s) pour que . corresponde à un caractère de nouvelle ligne.

(?<=<td>)\s*(\w*)\s*(?=<\/td>) 

DEMO

Et votre code serait,

Regex rgx = new Regex(@"(?s)(?<=<td>)\s*(\w*)\s*(?=<\/td>)"); 
foreach (Match m in rgx.Matches(input)) 
Console.WriteLine(m.Groups[1].Value);