2010-05-20 7 views
2

Je cherche à marquer des chaînes très simples, mais j'ai du mal à obtenir la bonne Regex.Simple Tokenizer C# utilisant Regex

Les cordes peuvent ressembler à ceci:

string1 = "{[Surname]}, some text... {[FirstName]}" 

string2 = "{Item}foo.{Item2}bar" 

Et je veux extraire les jetons dans les accolades (si string1 obtient "{[Surname]}","{[FirstName]}" et chaine2 obtient "{Item}" et "{Item2}")

Donc, en gros, il y a deux différents types de jetons que je veux extraire: {[Foo]} et {Bar}.

cette question est assez bonne, mais je ne peux pas obtenir la regex droite: poor mans lexer for c# Merci pour l'aide!

Répondre

1

moins que les règles sont très alambiquée, qui sera (?<Token>\{\[.+?\]\}) pour la première chaîne et (?<Token>\{.+?\}) pour la deuxième

1

Qu'en est-(?<token>\{[^\}]*\})

2

Ils sont tous les deux bonnes réponses les gars, merci. Voici ce que j'ai réglé à la fin:

// DataToken = {[foo]} 

// FieldToken = {Bar} 

string pattern = @"(?<DataToken>\{\[\w+\]\})|(?<FieldToken>\{\w+\})"; 

MatchCollection matches = Regex.Matches(expression.ExpressionString, pattern, 
RegexOptions.ExplicitCapture); 

string fieldToken = string.Empty; 
string dataToken = string.Empty; 

foreach (Match m in matches) 

{ 
    // note that EITHER fieldtoken OR DataToken will have a value in each loop 
    fieldToken = m.Groups["FieldToken"].Value; 
    dataToken = m.Groups["DataToken"].Value; 

    if (!string.IsNullOrEmpty(dataToken)) 
    { 
     // Do something 
    } 

    if (!string.IsNullOrEmpty(fieldToken)) 
    { 
     // Do something else 
    } 
}