【问题标题】:Simple C# Tokenizer Using Regex使用正则表达式的简单 C# 分词器
【发布时间】:2010-05-20 12:36:33
【问题描述】:

我正在寻找对非常简单的字符串进行标记,但很难获得正确的正则表达式。

字符串可能如下所示:

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

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

我想提取花括号中的标记(所以 string1 得到 "{[Surname]}","{[FirstName]}" 和 string2 得到 "{Item}""{Item2}"

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

这个问题很好,但我无法正确使用正则表达式: poor mans lexer for c# 感谢您的帮助!

【问题讨论】:

    标签: c# regex parsing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        (?&lt;token&gt;\{[^\}]*\})

        【讨论】:

          猜你喜欢
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 2013-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多