2010-02-04 6 views
4

J'ai une chaîne que j'ai besoin de faire plusieurs recherches et remplace pour supprimer les espaces de début et de fin à l'intérieur d'un attribut. Avant et après l'effet est montré ici (visuellement et avec un exemple JS de ce travail):Aide RegEx - conversion de JavaScript en C#

http://lloydi.com/x/re/

Maintenant, je dois faire l'équivalent en C# - remplacer toutes les références dans une chaîne. Mais je suis vraiment coincé. Je sais que le modèle est correct, comme indiqué dans la version JS, mais la syntaxe syntaxe/ESCAPE est en train de faire ma tête.

Voici ce que j'ai, mais bien sûr, cela ne fonctionne pas ;-)

//define the string 
string xmlString = "<xml><elementName specificattribute=" 111 222 333333 " anotherattribute="something" somethingelse="winkle"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>"; 

// here's the regExPattern - the syntax checker doesn't like this at all 
string regExPattern = "/(specificattribute=)"\s*([^"]+?)\s*"/g"; 

// here's the replacement 
string replacement = "$1\"$2\""; 

Regex rgx = new Regex(regExPattern); 
string result = rgx.Replace(xmlString, replacement); 
Est-ce que quelqu'un peut me dire l'erreur de mes manières?

Merci beaucoup!

+0

essayez de mettre un symbole @ à partir de la chaîne regExPattern comme ceci: chaîne regExPattern = @ "/ (specificattribute =)" \ s * (? [^ "] +) \ s * "/ g"; –

+3

Vous ne devriez pas utiliser regex pour analyser XML C# a des outils puissants pour manipuler des documents XML –

Répondre

2

Supprimez le/g à la fin de regExPattern. C'est la première erreur que je vois avec certitude. L'implémentation regex de .NET n'a pas de modificateur global, elle est globale par défaut.

MISE À JOUR:

Je pense que cela devrait fonctionner:

  //define the string 
      string xmlString = "<xml><elementName specificattribute=\" 111 222 333333 \" anotherattribute=\"something\" somethingelse=\"winkle\"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>"; 

      // here's the regExPattern - the syntax checker doesn't like this at all 
      string regExPattern = "(specificattribute=)\"\\s*([^\"]+?)\\s*"; 

      // here's the replacement 
      string replacement = "$1\"$2\""; 

      Regex rgx = new Regex(regExPattern); 
      string result = rgx.Replace(xmlString, replacement); 

Bien que cela puisse effectivement travailler pour vous, la nature imbriquée/spécifique au contexte de XML fait des expressions régulières mal adaptées pour analyser correctement et efficacement . Ce n'est certainement pas le meilleur outil pour le travail, disons-le de cette façon. Du point de vue des choses, vous devriez vraiment utiliser quelque chose comme Xpath ou Linq to XML pour analyser et modifier ces attributs.

Je suis pratiquement volais la réponse de Mark Byer, mais étant donné que son exemple est avec des fichiers xml et que vous faites cela en mémoire, il devrait être plus comme ceci:

XDocument doc = XDocument.Parse("<xml><elementName specificattribute=\" 111 222 333333 \" anotherattribute=\"something\" somethingelse=\"winkle\"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>"); 
foreach (XAttribute attr in doc.Descendants("elementName") 
           .Attributes("specificattribute")) 
{ 
    attr.Value = attr.Value.Trim(); 
} 
string result = doc.ToString(); 
3

Ne pas utiliser des expressions régulières pour cette tâche. .NET possède des outils puissants pour manipuler des documents XML. Essayez ceci à la place:

XDocument doc = XDocument.Load("input.xml"); 
foreach (XAttribute attr in doc.Descendants("elementName") 
           .Attributes("specificattribute")) 
{ 
    attr.Value = attr.Value.Trim(); 
} 
doc.Save("output.xml"); 
+0

+1 J'aime votre réponse mieux que la mienne. –

0

Sérieusement, vous devriez utiliser la classe System.Xml pour cela. Voici un autre exemple en utilisant XPath:

string xmlString = "<xml><elementName specificattribute=\" 111 222 333333 \" anotherattribute=\"something\" somethingelse=\"winkle\"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>"; 

    XmlDocument xml = new XmlDocument(); ; 
    xml.LoadXml(xmlString); 

    foreach (XmlAttribute el in xml.SelectNodes("//@specificattribute")) 
    { 
     el.Value = el.Value.Trim(); 
    }