使用Regex的简单C#Tokenizer

时间:2010-05-20 12:36:33

标签: c# regex parsing

我正在寻找真正简单的字符串,但努力获得正确的正则表达式。

字符串可能如下所示:

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

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

我想在花括号中提取标记(因此string1获取"{[Surname]}","{[FirstName]}"而string2获取"{Item}""{Item2}"

基本上,我想提取两种不同的令牌类型:{[Foo]}和{Bar}。

这个问题相当不错,但我无法正确使用正则表达式: poor mans lexer for c# 谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

他们都是很好的答案,谢谢。这就是我最终解决的问题:

// 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
   }
}

答案 1 :(得分:1)

除非规则非常复杂,否则第一个字符串为(?<Token>\{\[.+?\]\}),第二个字符串为(?<Token>\{.+?\})

答案 2 :(得分:1)

(?<token>\{[^\}]*\})

怎么样?