Transformer une en un avec Regex / C #

Étrange question, mais je ne perdrai pas de temps à expliquer pourquoi je dois le faire, mais seulement à le faire.

J’ai le suivant:

 

J’ai besoin de transformer ça en:

 

J’utilise C # / asp.net (3.5 ou inférieur) et javascript pour le performJS (qui est un espace réservé jusqu’à ce que je sache comment remplacer le code HTML).

Veuillez noter que la source fournissant ceci m’envoie une chaîne avec les nombreuses lignes des entrées. Et je dois remplacer chaque ligne par les informations valables.

Pour le moment, j’ai essayé d’append un .Replace (“”, “\”> “); qui remplace les balises radio, mais donne visiblement un air horrible, et ne supprime pas l’étiquette et ne place pas le contenu de l’étiquette dans entre les balises.

Je suis sûr que ceci est probablement mieux résolu par une regex, mais je ne suis pas très familier avec regex. J’ai essayé avec regexlib de voir si je pouvais trouver une regex par moi-même … voici ce que j’ai jusqu’à présent, même si j’imagine que je suis assez loin.

 ssortingng strRegex = @"]*>"; RegexOptions myRegexOptions = RegexOptions.IgnoreCase | RegexOptions.Multiline; Regex myRegex = new Regex(strRegex, myRegexOptions); ssortingng strTargetSsortingng = @" 
"; ssortingng strReplace = ""; return myRegex.Replace(strTargetSsortingng, strReplace);

Je suis sûr que ceci est probablement mieux résolu par une regex, mais je ne suis pas très familier avec regex.

Je crains que ce ne soit pas un bon signe, car si vous n’êtes pas très familier avec les regex, il est alors plutôt improbable que rien soit mieux résolu par une regex. 🙁

Il n’ya pas assez de description du problème pour savoir avec certitude si même un assistant d’expression régulière pourrait rapidement élaborer une solution à l’aide de regex. Je suis presque certain que vous devez faire plus que simplement échanger une chaîne fixe contre une autre, car si vous l’aviez fait, vous l’auriez déjà fait. Donc, certaines parties doivent être paramétrées. Je ne sais juste pas lequel.

Sans compter les espaces, diriez-vous que votre problème est de transformer les entrées de ce formulaire:

   

en sortie de cette forme:

  

Comme vous le voyez, j’ai paramétré X , Y , Z et N. Voici les questions que j’ai pour vous:

  1. Diriez-vous que mon paramétrage de votre problème le décrit avec précision?

  2. Est-ce que cela valide sous une DTD particulière, et si oui, laquelle?

  3. Les atsortingbuts sont-ils toujours autres que ceux?

  4. Les atsortingbuts qui apparaissent toujours dans cet ordre précis?

  5. Combien de ces choses devez-vous faire?

  6. Est-ce que cela se produit en HTML simple ou est-ce caché dans du Javascript?

  7. Savez-vous s’il existe des éléments ou

    , ou des commentaires contenant des éléments qui correspondent exactement à ce que vous recherchez?

  8. Savez-vous si de tels éléments interviennent au milieu de la chose que vous recherchez?

  9. Est-ce que tous les atsortingbuts du formulaire NAME="VALUE" avec seulement des guillemets doubles autour de la valeur, jamais de guillemets simples ou complètement omis?

  10. La casse des identifiants est-elle toujours en minuscule?

  11. Sont-ils tous dans un seul fichier?

  12. Y a-t-il une raison pour laquelle votre échantillon de sortie a perdu certains de ses espaces non significatifs?

Ce sont des questions comme celles-ci qui montrent pourquoi le problème est certainement beaucoup plus compliqué qu'il n'y paraît - ce qui soulève quelques questions finales:

  1. Avez-vous déjà utilisé une classe d'parsing HTML auparavant?

  2. Voulez-vous apprendre comment?

N’utilisez pas d’expressions régulières pour travailler avec HTML. Il n’est suffisamment flexible que pour 95% des cas, ce qui devrait vous indiquer que c’est le mauvais outil pour le poste.

En utilisant le HTML Agility Pack , vous pouvez charger votre document et utiliser quelque chose comme ceci pour remplacer …

 HtmlDocument doc = new HtmlDocument(); doc.Load(@"C:\Path\To\Page.html"); HtmlNode radios = doc.SelectNodes("//input[@type=radio]"); foreach (HtmlNode node in radios) { HtmlAtsortingbute name = node.Atsortingbutes["name"]; if (name != null && name.ToLower().StartsWith("eq_")) { //Build your button element and replace the radio using ReplaceChild } } 

Cet exercice fait ce dont vous avez besoin en utilisant des expressions régulières.

Voici comment cela fonctionne: je ne remplace pas les valeurs de la chaîne d’origine. Au lieu de cela, je prends la chaîne de but, où nous voulons arriver, et le construit avec les valeurs correctes. Je crois que cette approche vous donnera de la flexibilité, vous pouvez formater la chaîne de sortie comme vous le souhaitez.

  • InputList est une liste de cas de test.
  • La cible est la chaîne de but avec des espaces réservés, nous pouvons la formater comme nous le voulons / devons / devons.
  • La méthode GetValue () utilise l’argument regex pour rechercher une valeur spécifique. Il trouve la balise html sous forme de paire KeyValue, prend la valeur et supprime les guillemets.
  • Enfin, avec ssortingng.Format (), nous construisons la chaîne de sortie comme vous le souhaitez.

C’est un code complet, vous pouvez donc l’essayer. Vous pouvez également transformer l’idée de ce morceau de code en une méthode et l’intégrer à votre solution.

S’il vous plaît laissez-moi savoir si cela a fonctionné pour vous aussi.

  static void Main(ssortingng[] args) { List inputList = new List(); inputList.Add(" 
"); inputList.Add("
"); inputList.Add("
"); inputList.Add("
"); inputList.Add("
"); ssortingng output = ssortingng.Empty; ssortingng target = "
"; foreach (ssortingng input in inputList) { ssortingng name = GetValue(@"(?name=[\S]+)", input); ssortingng id = GetValue(@"(?id=[\S]+)", input); ssortingng title = GetValue(@"(?title=[\S]+)", input); ssortingng value = GetValue(@"(?value=[\S]+)", input); output = ssortingng.Format(target, name, id, title, value); System.Diagnostics.Debug.WriteLine(output); } } private static ssortingng GetValue(ssortingng pattern, ssortingng input) { Regex regex = new Regex(pattern); Match match = regex.Match(input); return match.ToSsortingng().Split('=').Last().Replace("\"", ssortingng.Empty); }

c’est l’entrée:

   




c’est la sortie: