超能力:仅当字符串以行开头时才将其与解析器匹配

时间:2018-10-08 16:31:03

标签: c# tokenize superpower

在超能力中进行解析时,仅当字符串在一行中时才如何匹配字符串?

例如,我需要在“ A:Hello Goodbye \ n”中匹配A冒号,而不是在“ Goodbye A:Hello \ n”中匹配A

3 个答案:

答案 0 :(得分:1)

使用您的示例here,我将您的ActorParserNodeParser的定义更改为:

public readonly static TokenListParser<Tokens, Node> ActorParser =
    from name in NameParser
    from colon in Token.EqualTo(Tokens.Colon)
    from text in TextParser
    select new Node {
        Actor = name + colon.ToStringValue(),
        Text = text
    };

public readonly static TokenListParser<Tokens, Node> NodeParser =
    from node in ActorParser.Try()
        .Or(TextParser.Select(text => new Node { Text = text }))
    select node;

我觉得Superpower存在一个错误,因为我不确定为什么在NodeParser中将Try()与{{1}链接时,必须在第一个解析器上放置一个Or() },但是如果我不添加它,则会抛出错误。

此外,您检查input[1]时的验证不正确(可能只是复制粘贴问题)。应该检查"Goodbye A: Hello"而不是"Hello A: Goodbye"

答案 1 :(得分:0)

除非设置了RegexOptions.Multiline,否则^会匹配字符串的开头,而不管它是否位于行的开头。

您可能可以使用内联(?m)打开多行:

static TextParser<Unit> Actor { get; } =
  from start in Span.Regex(@"(?m)^[A-Za-z][A-Za-z0-9_]+:")
  select Unit.Value;

答案 2 :(得分:0)

我实际上已经做了类似的事情,但是我没有使用Tokenizer。

private static string _keyPlaceholder;

private static TextParser<MyClass> Actor { get; } =
    Span.Regex("^[A-Za-z][A-Za-z0-9_]*:")
        .Then(x =>
             {
                 _keyPlaceholder = x.ToStringValue();
                 return Character.AnyChar.Many();
             }
         ))
    .Select(value => new MyClass { Key = _keyPlaceholder, Value = new string(value) });

我还没有测试,只是通过内存将其写出。上面的解析器应具有以下内容:

myClass.Key = "A:"
myClass.Value = " Hello Goodbye"