2008-11-13 10 views
6

Je dois découper et sauvegarder/utiliser une partie d'une chaîne en C#. Je pense que la meilleure façon de le faire est d'utiliser Regex. Ma chaîne ressemble à ceci:Comment couper une partie d'une chaîne avec une regex?

"changed from 1 to 10".

J'ai besoin d'un moyen de découper les deux nombres et de les utiliser ailleurs. Quel est un bon moyen de le faire?

Répondre

11

vérification des erreurs gauche comme un exercice ...

 Regex regex = new Regex(@"\d+"); 
     MatchCollection matches = regex.Matches("changed from 1 to 10"); 
     int num1 = int.Parse(matches[0].Value); 
     int num2 = int.Parse(matches[1].Value); 
2

Dans votre expression régulière, placez les champs que vous souhaitez enregistrer entre parenthèses, puis utilisez la propriété Match.Captures pour extraire les champs correspondants.

Il existe un exemple C# here.

1

Utilisez des groupes de capture nommés.

Regex r = new Regex("*(?<FirstNumber>[0-9]{1,2})*(?<SecondNumber>[0-9]{1,2})*"); 
string input = "changed from 1 to 10"; 
string firstNumber = ""; 
string secondNumber = ""; 

MatchCollection joinMatches = regex.Matches(input); 

foreach (Match m in joinMatches) 
{ 
    firstNumber= m.Groups["FirstNumber"].Value; 
    secondNumber= m.Groups["SecondNumber"].Value; 
} 

Obtenez Expresson pour vous aider, il a une exportation à l'option C#.

AVERTISSEMENT: Regex est probablement pas droit (ma copie de Expresso expiré: D)

4

qui correspondent aux critères exactement la chaîne "changé de x à y":

string pattern = @"^changed from ([0-9]+) to ([0-9]+)$"; 
Regex r = new Regex(pattern); 
Match m = r.match(text); 
if (m.Success) { 
    Group g = m.Groups[0]; 
    CaptureCollection cc = g.Captures; 

    int from = Convert.ToInt32(cc[0]); 
    int to = Convert.ToInt32(cc[1]); 

    // Do stuff 
} else { 
    // Error, regex did not match 
} 
+0

r.Match doit être majuscule 'M'. Cet exemple me donne une exception System.InvalidCastException lorsque je la teste: Impossible de convertir System.Text.RegularExpressions.Match en System.Iconvertible – Cros

+0

Cela échoue car vous consultez le CaptureCollection qui est incorrect. Ce code va correspondre à trois groupes (le texte entier, les premières parentes et les deuxièmes parentes) avec un Capture chacun. Le code de cet exemple utilise donc la correspondance avec le texte entier et un élément hors de portée. – Cros

+0

En outre, lors de la conversion à partir d'un objet Capture, vous devez utiliser la propriété Value. – Cros

0

Voici un extrait de code qui ne presque ce que je voulais:

using System.Text.RegularExpressions; 

string text = "changed from 1 to 10"; 
string pattern = @"\b(?<digit>\d+)\b"; 
Regex r = new Regex(pattern); 
MatchCollection mc = r.Matches(text); 
foreach (Match m in mc) { 
    CaptureCollection cc = m.Groups["digit"].Captures; 
    foreach (Capture c in cc){ 
     Console.WriteLine((Convert.ToInt32(c.Value))); 
    } 
} 
Questions connexes