2010-12-15 6 views
1

J'ai un texte dont voici un échantillon:Qu'est-ce qui ne va pas avec cette regex?

2_Chief Ships.Niobe 2 0 2 1.0 
    3_Chief Vehicles.WillisMB_US 1 
[0_Chief_Road] 
    77704.27 140254.33 120.00 0 2 9.166666984558105 
    100653.84 140379.05 120.00 
[2_Chief_Road] 
    76911.77 139996.94 120.00 0 2 3.8583335876464844 
    100446.47 140028.61 120.00 

Je veux récupérer cette partie sous [0_Chief_Road]:

77704.27 140254.33 120.00 0 2 9.166666984558105 
100653.84 140379.05 120.00 

J'utilise ce code:

System.Text.RegularExpressions.Regex reg = null; 
string routeTitle = "[0_Chief_Road]"; // this is hard coded for StackOverflow 
reg = new System.Text.RegularExpressions.Regex(@"(?<=" + routeTitle + @")[\d\.\s]+(?=\[)"); 
string routeText = reg.Match(chiefsSection).Captures[0].ToString(); 

Le résultat que j'obtiens est:

4.27 140254.33 120.00 0 2 9.166666984558105 
    100653.84 140379.05 120.00 

... qui est tout après le premier zéro! J'ai essayé de changer les valeurs et il retourne toujours tout après le premier zéro. Je ne comprends pas pourquoi !!

Quelqu'un peut-il aider? Je vous remercie!

Gregg

Répondre

2

Le problème est que routeTitle contient des crochets qui, lorsqu'il est utilisé dans une expression régulière, sera interprété comme une classe de caractères. Vous devez échapper toute chaîne littérale avant de l'insérer dans une expression régulière.

vous devez donc utiliser string routeTitle = @"\[0_Chief_Road\]";

Ou utilisez la fonction Regex.Escape():

string routeTitle = "[0_Chief_Road]"; // this is hard coded for StackOverflow 
reg = new System.Text.RegularExpressions.Regex(@"(?<=" + Regex.Escape(routeTitle) + @")[\d\.\s]+(?=\[)"); 

Soyez conscient que le CRLF après [0_Chief_Road] fera également partie du match - si vous ne voulez pas que, ajoutez \s+ à la fin de l'assertion lookbehind.

+0

Oui, c'est ça. Merci de m'avoir réveillé! – MrGreggles

Questions connexes