2012-06-07 4 views
1

Je voudrais dépouiller les chaînes, mais seulement laisser les éléments suivants:Regex pour supprimer les caractères sauf les caractères donnés?

[a-zA-Z]+[_a-zA-Z0-9-]* 

Je suis en train de chaînes de sortie qui commencent par un caractère, peut alors alphanumérique, soulignement et des tirets. Comment puis-je faire cela avec RegEx ou une autre fonction?

+0

vous avez la regex - avec quoi avez-vous des problèmes? –

+0

Par chaînes, vous voulez dire une 'chaîne []'? Est-ce que «obtenir tous les matchs» ne signifie pas «ne pas obtenir des choses qui ne correspondent pas»? – vcsjones

Répondre

2

Parce que tout dans la deuxième partie de la regex est dans la première partie, vous pourriez faire quelque chose comme ceci:

String foo = "[email protected]#$5o993idl;)"; // your string here. 
//First replace removes all the characters you don't want. 
foo = Regex.Replace(foo, "[^_a-zA-Z0-9-]", ""); 
//Second replace removes any characters from the start that aren't allowed there. 
foo = Regex.Replace(foo, "^[^a-zA-Z]+", ""); 

commencer donc par éplucher vers le bas pour seulement les caractères autorisés. Ensuite, débarrassez-vous de tous les caractères autorisés qui ne peuvent pas être au début.

Bien sûr, si votre regex devient plus compliquée, cette solution s'effondre assez rapidement.

0

Edité

var s = Regex.Matches(input_string, "[a-z]+(_*-*[a-z0-9]*)*", RegexOptions.IgnoreCase); 
      string output_string=""; 
      foreach (Match m in s) 
      { 
       output_string = output_string + m; 

      } 
    MessageBox.Show(output_string); 
+0

C'est bizarre ... entrer sdgfsd * ^% & $ AFSds retourne sdgfsd. C'est comme s'il se fermait après avoir trouvé une chaîne spéciale. – TruMan1

+0

@ TruMan1 Que voulez-vous dire par bande? OP demande à propos de l'extraction de la chaîne d'une chaîne donnée. –

+0

Je m'attendrais à ce que sdgfsd * ^% & $ AFSds retourne sdgfsdAFSds mais il retourne sdgfsd. – TruMan1

0

En supposant que vous avez les cordes dans une collection, je le ferais de cette façon:

  1. élément foreach dans la collection essayer correspondre à la regex
  2. si le succès, retirez la chaîne de la! collection

Ou l'inverse - s'il correspond, ajoutez-le à une nouvelle collection.

Si les chaînes ne sont pas dans une collection, pouvez-vous ajouter plus de détails quant à ce à quoi ressemble votre entrée?

0

Si vous voulez retirer tous les identifiants correspondant à votre expression régulière, vous pouvez le faire comme ceci:

var input = " _wontmatch f_oobar0 another_valid "; 
var re = new Regex(@"\b[a-zA-Z][_a-zA-Z0-9-]*\b"); 
foreach(Match match in re.Matches(input)) 
    Console.WriteLine(match.Value); 
0

Utilisez MatchCollection matchColl = Regex.Matches("input string","your regex");

Ensuite, utilisez:

string [] outStrings = new string[matchColl.Count]; //A string array to contain all required strings 

for (int i=0; i < matchColl.Count; i++) 
    outStrings[i] = matchColl[i].ToString(); 

Vous aura toutes les chaînes requises dans outStrings. J'espère que cela t'aides.

Questions connexes