Je suis totalement nouveau à des expressions régulières. Et ce que j'ai besoin pour atteindre, c'est que j'ai une variable de chaîne contenant la chaîne suivante par exemple,
"mon nom est # p_name # et je suis # p_age # ans" p>
J'ai besoin d'extraire Les deux chaînes P_NAME et P_AGE à l'aide d'expressions régulières (à une matrice de chaîne ou à deux variables de chaîne, etc.). c'est-à-dire que la chaîne commence par un # et se termine par un # et j'ai besoin d'extraire la partie centrale. p>
Comment puis-je faire cela en C # en utilisant des expressions régulières. P>
et comment Puis-je extraire le même ci-dessus au cas où j'ai un nouveau caractère de ligne entre aussi. C'est-à-dire par exemple, p>
"mon nom est # p_name # et \ r \ n je suis # p_age # ans". P>
Merci P>
Merci tout le monde. .. P>
Après avoir travaillé pour moi ... Je ne peux pas publier ma propre réponse comme réponse jusqu'à 8 heures à expiration de Stackoverflow ... :) p>
string str = "My Name is #P_NAME# and \r\n I am #P_AGE# years old"; MatchCollection allMatchResults = null; var regexObj = new Regex(@"#\w*#"); allMatchResults = regexObj.Matches(str);
7 Réponses :
Essayez d'utiliser
var format = "My Name is #P_NAME# and \r\n I am #P_AGE# years old"; Regex rgxp = new Regex(@"#[(?<name>\S+)\]#", RegexOptions.Compiled); Match m = rgxp .Match(format); if (true == m.Success) { return m.Groups["name"].Value; // <-- this statement returns the value you're looking for }
-1. Cette réponse a beaucoup de problèmes. Pour commencer, le code ne compilera même pas, et s'il l'a fait, la regex i> ne compilerait pas.
-1 convenu - quelle est la regex ici? Ou destiné à faire?
@el: J'ai remarqué ma typo - j'ai manqué la définition du format code> var
@alan: J'ai remarqué mon typo - j'ai manqué la définition du format code> var
C'est un début, mais la déclaration à l'intérieur du bloc code> si code> est toujours juste une référence - ce n'est pas faire i> n'importe quoi. Et la regex ne compilera pas car il a une touche non évaluée Ouverture i> Square Support suivie d'un support de fermeture Square i> Square, quand il n'a pas besoin de crochets du tout; @ "# (?
@Alan: Je prends votre commentaire comme un retour précieux. Êtes-vous lié au fait que ma réputation a diminué de 500 points en une seule journée? À la date de référence - je voulais donner à l'utilisateur la syntaxe pour obtenir la valeur réelle sans savoir ce qu'il / elle veut faire avec elle. J'aurais pu simplement ajouter une déclaration à l'impression à la console, mais pensée non nécessaire
Si vous avez vraiment perdu 500 représentants en une journée, vous devez le supporter avec les administrateurs. Ce n'est certainement pas le résultat de quoi que ce soit i i> a fait.
ESSAYE -
var results = new List<string>(); var subjectString = "My Name is #P_NAME# and \r\n I am #P_AGE# years old"; Regex regexObj = new Regex("#.+?#"); Match matchResults = regexObj.Match(subjectString); while (matchResults.Success) { results.Add(matchResults.ToString().Replace("#","")); matchResults = matchResults.NextMatch(); }
Pourquoi Ignorecase et Multiline sont-ils spécifiés? MULTILINE n'affecte que les caractères ^ et $, et il n'y a pas de caractères littéraux spécifiés do Ignorecase ne fait rien.
Une expression régulière telle que Il existe différentes alternatives qui fonctionneraient pour cela, tels que Le code suivant irait le # P_NAME # et # P_AGE #. p> "# [^ #] + #" code> correspondrait à un hachage, suivi d'un ou de plusieurs caractères sans hachage, suivi d'un autre hachage.
"#. *? #" code>. p>
L'option singline code> ne serait nécessaire que si les espaces réservés pouvaient contenir des lignes ligne (par exemple,
#p \ nname # code>), ce qui ne semble pas très probable.
Vous pouvez le faire comme ceci démo ici p> i Je ne sais pas quelle est votre candidature, mais je dois dire que ce n'est pas une méthode de transfert de données très robuste. Commencez à obtenir quelques autres Cependant, si vous pouvez vous garantir que vous travaillerez toujours avec une chaîne de ce format, cela fonctionne. P> < p> Explication de la regex premier # code> s intérieur et tout va mal. Par exemple, des personnes avec
# code> dans leurs noms! P>
# (. +?) # code> p>
# code> correspond à un
# p> p> p> < p>
( code> commence un groupe em>. indexé dans
.groups [1] code> dans le code.
[0] code> est l'ensemble correspondant par exemple
#dave # code> non seulement
Dave code> p>
. +? code> correspond au moins un caractère.
. code> est un caractère.
+ code> est la répétition (au moins
une fois que). Et
? Code> indique au moteur de regex d'être paresseux - alors ne correspond pas à un
# code> comme cela sera assorti par notre final
# p >
) code> ferme le groupe p>
# code> correspond à un autre
# code> - la "fermeture" dans ce cas < / p> p>
Merci tout le monde ...
Après avoir travaillé pour moi ... p> "AllMatchResults" contient # p_name # et # p_age # (c'est-à-dire y compris # caractère). Mais avoir aide mon autre logique p> p>
Avez-vous été aidé à trouver cette réponse par d'autres affiches, à savoir Samjudson, IPR101 ou moi-même?
Voici une méthode d'extension basée sur cette ... Profitez-en. :)
BTW - cela ne garde pas les caractères # - quelque chose que je ne voulais pas - vous pouvez changer la regex à ceux ci-dessus pour obtenir cela. p>
public static class StringExtensions { ///---------------------------------------------------------------------- /// <summary> /// Gets the matches between delimiters. /// </summary> /// <param name="source">The source string.</param> /// <param name="beginDelim">The beginning string delimiter.</param> /// <param name="endDelim">The end string delimiter.</param> /// <returns></returns> /// <example> /// string beginDelim = "<span>"; /// string endDelim = "</span>"; /// string input = string.Format("My Name is {0}Lance{1} and I am {0}39{1} years old", beginDelim, endDelim); /// /// var values = input.GetMatches(beginDelim, endDelim); /// foreach (string value in values) /// { /// Console.WriteLine(value); /// } /// </example> ///---------------------------------------------------------------------- public static IEnumerable<string> GetMatches(this string source, string beginDelim, string endDelim) { Regex reg = new Regex(string.Format("(?<={0})(.+?)(?={1})", Regex.Escape(beginDelim), Regex.Escape(endDelim))); MatchCollection matches = reg.Matches(source); return (from Match m in matches select m.Value).ToList(); } }
Étant donné que des caractères spéciaux nécessitent souvent une échappée pour être traité comme des motifs littéraux, j'ai ajouté regex.escape code> pour
Begindelim code> et
enddelim code>.
Personne non mentionné des cas multilignes, donc si vous avez une chaîne multiligne, comme: Vous devez spécifier le drapeau réponse posté pour les futurs lecteurs em> p> p> P> singleline code> pour ignorer la nouvelle ligne caractères et échapper à la barre oblique. p>