J'écris un analyseur syntaxique pour Excel qui peut mettre à jour les valeurs dans le document. Je suis actuellement en train d'analyser la partie en-tête/pied de page du format de document de la feuille de calcul. Le format d'un en-tête/pied de page dans Excel est stocké sous forme de texte brut, délimité par :
&L
&C
&R
Ainsi, votre en-tête / pied de page pourrait ressembler à ceci dans le xml :
<odaysDate&CDocumentTitle&RAuthors Name
Si vous n'avez qu'un en-tête gauche et un en-tête droit, votre chaîne xml ressemblera à ceci :
<odaysDate&RAuthors Name
J'ai essayé de créer un modèle capable de détecter chacun de ces groupes et d'en extraire le composant (par ex. &L
, &C
, &R
) ainsi que tout le texte qui suit cette balise.
La chaîne regex est la suivante : (&.{1})([A-Za-z\d_ ]*)
( Lien vers l'exemple )
Cependant, j'ai un problème marginal qui m'empêchera d'analyser correctement les en-têtes Excel contenant des esperluettes.
Dans un en-tête excel, pour que votre document ait une esperluette dans le titre (ceci est en texte brut), vous devez taper &&
. Ainsi, le xml d'un en-tête avec une esperluette pourrait ressembler à ceci :
&RPork && Beans
(ce qui afficherait "Porc et haricots" dans la feuille de calcul).
Mon regex n'est pas capable de faire face à l'esperluette prématurée. Dans le premier groupe ( (&.{1})
) Je demande tout ce qui a une esperluette et le caractère qui la suit (c'est-à-dire un L/C/R). Comment puis-je dire à ce groupe de ne pas l'inclure lorsqu'il y a deux esperluettes ? Mes compétences en matière d'expressions rationnelles sont plutôt novices, mais je peux décrire ce que je veux à un niveau supérieur :
Je veux diviser la chaîne de caractères à chaque fois que je vois &L/&C/&R et capturer tout le texte après, jusqu'à un autre délimiteur &L/&C/&R (en excluant les espaces de nouvelle ligne, etc.). Je peux décrire cela au mieux en C# linq ci-dessous.
(&.{1}.Where(c => c != '&'))([A-Za-z\d_ ]*)
Pour la chaine de caractères "&RPork && Beans"
ma regex capture 2 correspondances avec chacune 2 groupes :
match 1
groupe 1 : "&R" groupe 2 : "Pork" (porc)
match 2
groupe 1 : "&&" groupe 2 : " Haricots "
et je voudrais que ça corresponde une fois :
groupe 1 : "&R" groupe 2 : "Porc & & haricots"
Merci pour votre aide