C# 超级能力:匹配除标记器以外的任何非白色字符

C# 超级能力:匹配除标记器以外的任何非白色字符,c#,parsing,superpower,C#,Parsing,Superpower,我想使用Nuget包匹配所有非白色字符,除非它是标记化值。例如: var s=“一些随机文本{variable}”; 应导致: ["some", "random", "text", "variable"] 但我现在得到的是: ["some", "random", "text{variable}"] 它的解析器如下所示: 公共静态类TextParser { 公共静态文本分析器EncodedContent=> 从Character.EqualTo(“{”)中打开 来自字符中的字符。除了('}'

我想使用
Nuget
包匹配所有非白色字符,除非它是标记化值。例如:

var s=“一些随机文本{variable}”;
应导致:

["some", "random", "text", "variable"]
但我现在得到的是:

["some", "random", "text{variable}"]
它的解析器如下所示:

公共静态类TextParser
{
公共静态文本分析器EncodedContent=>
从Character.EqualTo(“{”)中打开
来自字符中的字符。除了('}')。许多()
从字符中的close.EqualTo(“}”)
选择新字符串(字符);
公共静态文本分析器HtmlContent=>
来自Span.NonWhiteSpace中的内容
选择content.ToString();
}
当然,我将在解析器中的另一个变量中返回字符串。但这只是简化了


希望这是足够的信息。如果不是的话,我会在Github上完成整个回购协议

也许你可以写得更简单些,但那是我的第一个想法。我希望这有助于:

    Regex tokenizerRegex = new Regex(@"\{(.+?)\}");
    var s = "some random text{variable}";
    string[] splitted = s.Split(' ');
    List<string> result = new List<string>();
    foreach (string word in splitted)
    {
        if (tokenizerRegex.IsMatch(word)) //when a tokenized value were recognized
        {
            int nextIndex = 0;
            foreach (Match match in tokenizerRegex.Matches(word)) //loop throug all matches
            {
                if (nextIndex < match.Index - 1) //if there is a gap between two tokens or at the beginning, add the word
                    result.Add(word.Substring(nextIndex, match.Index - nextIndex));
                result.Add(match.Value);
                nextIndex = match.Index + match.Length; //Save the endposition of the token
            }
        }
        else
            result.Add(word);//no token found, just add the word.
    }
    Console.WriteLine("[\"{0}\"]",string.Join("\", \"", result));
Text:
一些随机文本{variable}{next}

["some", "random", "text", "{variable}", "{next}"]
["some", "random", "text", "{variable}","and", "{next}"]
Text:
一些随机文本{variable}和{next}

["some", "random", "text", "{variable}", "{next}"]
["some", "random", "text", "{variable}","and", "{next}"]

可能有许多不同的方法来解析输入,根据输入的实际复杂程度(如您所说的简化),您可能需要对此进行调整。但使用超级大国的最佳方法是创建小型解析器,然后在它们的基础上进行构建。请参见下面的我的解析器及其描述(每个解析器都建立在前面的基础上):

哪些产出:

["some", "random", "text", "variable"]
这里的想法是构建一个解析器来解析出一个内容,然后利用Superpower的内置解析器
ManyDelimitedBy
来模拟在你想要解析出的真实内容之间的空白上的“分割”。这将产生一系列“内容”片段


此外,您可能希望利用Superpower的令牌功能,在解析失败时生成更好的错误消息。这是一种稍有不同的方法,但请看一看,了解更多有关如何使用标记器的信息,但如果您不需要更友好的错误消息,那么它是完全可选的。

为什么不简单地用空格替换
{
},然后继续?我想使用解析引擎来完成这项工作。这比这个例子更复杂。与我实际做的事情相比,这个例子简化了:-)感谢您深思熟虑的回答,但我确实在寻找一个带有正式解析器的答案。随着代码复杂性的增加,使用解析器库等形式化过程来解析文本变得越来越重要。我提出的问题是简化我需要解析文本的目的。它比这更复杂,并将继续增长。我真的在寻找一个使用Superpower库的解决方案。更新了我的问题,使其更加明确,我正在寻找一个使用nuget package Superpower解决此问题的解决方案。再次感谢!对不起,我从来没有和超级大国合作过。你不应该如此简化你的案子。希望有人能帮忙。这是简化的标准,也是提问和解决难题的最佳实践。否则你需要一整本书来展示你所需要的!是的,人们因为你没有简化而对你大喊大叫:-)这与你对你最初帖子的评论有关,上面写着“我问了一个问题,做了一些不同的事情”,并不意味着你应该发布你的全部代码。没关系,我希望有人能回答你的问题。也许你可以问问nuget软件包的创建者。
["some", "random", "text", "variable"]