2010-07-15 4 views
0

Je souhaite extraire le dernier caractère d'une chaîne. En fait, je devrais clarifier avec l'exemple. Voici la chaîne à partir de laquelle je veux extraire:Extraction du dernier caractère d'une phrase à l'aide de Regex

<spara h-align="right" bgcolor="none" type="verse" id="1" pnum="1"> 
    <line> 
     <emphasis type="italic">Approaches to Teaching and Learning</emphasis> 
    </line> 
</spara> 

Dans la chaîne ci-dessus que je veux insérer un espace entre le mot « apprentissage » et « </emphasis> » s'il n'y a pas présente dans l'espace.

Merci,

+2

Certains utilisateurs ont suggéré d'utiliser Linq2XML ou XPath, mais vous demandez clairement à une expression régulière. Pouvez-vous préciser si c'est une exigence stricte ici? Le document est-il si volumineux que vous ne pouvez pas ou ne devez pas le charger dans un DOM? – Abel

+0

Indépendamment du chargement du document complet, Regex en tant qu'analyseur XML est un concept condamné. Si le document est trop volumineux pour être chargé en une fois, .net propose XmlReader/XmlWriter qui peut être utilisé pour parcourir les noeuds du document sans charger complètement le document. – spender

+0

@spender: Je ne pouvais pas être plus d'accord. Et XmlReader/Writer sont extrêmement rapides dans mon expérience. – Abel

Répondre

0

Quelque chose comme ce qui suit peut-être?

Regex.Replace(yourString, @"(>[^<]+[^ ])<", @"$1 <"); 

La solution prend une phrase est comprise entre > et < et est un ou plusieurs caractères.

La phrase est-elle vraiment dans XML, ou l'avez-vous extraite en utilisant l'une des nombreuses méthodes XML ou DOM? Par exemple, en utilisant ceci:

foreach(node in YourDOM.SelectNodes("//emphasis[@type='italic']")) 
{ 
    string yourString = node.FirstChild.Value; 
} 

Si oui, si la chaîne est lui-même, vous pouvez le faire à la place, ce qui est plus simple et plus sûre:

Regex.Replace(yourString, "([^ ])$", "$1 "); 

EDIT: I à l'origine manqué s'il n'y a pas d'espace présent, le poste est au-dessus édité avec cette information

1

Jetez un oeil à quelques-uns des exemples LINQ à XML ici au lieu d'utiliser Regex.

+0

pas regex n'est pas strictement nécessaire Linq 2 xml sera également très apprécié si quelqu'un peut aider à cet égard. –

1

avec LINQ pour XML que vous pouvez le faire comme suit:

XDocument doc = XDocument.Load("xmlfilename"); 

foreach (var emphasis in doc.Descendants("emphasis")) 
{ 
     if (emphasis.Value.Last() != ' ') 
     emphasis.Value += " "; 
} 
doc.Save("outputfilename"); 

Au lieu de fichiers que vous pouvez utiliser les flux, lecteurs, etc dans la charge

+0

+1 J'aime l'exemple clair et le bon conseil (mais ce n'était pas ce qui était demandé;) – Abel

Questions connexes