Там может быть много разных способов для анализа вашего ввода, и в зависимости от того, насколько сложнее ваши входные данные (как вы говорите, вы упростили это), вам, вероятно, придется настроить это.Но лучший способ использовать Superpower - это создавать небольшие парсеры, а затем использовать их.Смотрите мои парсеры и их описания ниже (каждый из которых построен на предыдущем):
/// <summary>
/// Parses any character other than whitespace or brackets.
/// </summary>
public static TextParser<char> NonWhiteSpaceOrBracket =>
from c in Character.Except(c =>
char.IsWhiteSpace(c) || c == '{' || c == '}',
"Anything other than whitespace or brackets"
)
select c;
/// <summary>
/// Parses any piece of valid text, i.e. any text other than whitespace or brackets.
/// </summary>
public static TextParser<string> TextContent =>
from content in NonWhiteSpaceOrBracket.Many()
select new string(content);
/// <summary>
/// Parses an encoded piece of text enclosed in brackets.
/// </summary>
public static TextParser<string> EncodedContent =>
from open in Character.EqualTo('{')
from text in TextContent
from close in Character.EqualTo('}')
select text;
/// <summary>
/// Parse a single content, e.g. "name{variable}" or just "name"
/// </summary>
public static TextParser<string[]> Content =>
from text in TextContent
from encoded in EncodedContent.OptionalOrDefault()
select encoded != null ? new[] { text, encoded } : new[] { text };
/// <summary>
/// Parse multiple contents and flattens the result.
/// </summary>
public static TextParser<string[]> AllContent =>
from content in Content.ManyDelimitedBy(Span.WhiteSpace)
select content.SelectMany(x => x.Select(y => y)).ToArray();
Затем запустите его:
string input = "some random text{variable}";
var result = AllContent.Parse(input);
Какие выходные данные:
["some", "random", "text", "variable"]
* 1009Идея состоит в том, чтобы создать синтаксический анализатор для анализа одного контента, а затем использовать встроенный синтаксический анализатор Superpower с именем
ManyDelimitedBy
, чтобы имитировать «расщепление» в пустом пространстве между реальным контентом, который вы хотите проанализировать.Это приводит к массиву «контентных» фрагментов.
Также вы можете воспользоваться функциональностью токена Superpower для получения лучших сообщений об ошибках при сбое анализа.Это немного другой подход, но посмотрите на этот пост в блоге , чтобы узнать больше о том, как использовать токенизатор, но это совершенно необязательно, если вам не нужны более дружественные сообщения об ошибках.