超级大国:仅当字符串开始一行时才匹配字符串

在超级大国中解析时,如果只是一个字符串中的第一个字符串,如何匹配字符串?

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

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

 public readonly static TokenListParser 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 NodeParser = from node in ActorParser.Try() .Or(TextParser.Select(text => new Node { Text = text })) select node; 

我觉得Superpower有一个错误,因为我不确定为什么在NodeParser我必须在第一个解析器上使用Or()链接时使用Try() Or() ,但如果我没有它会抛出错误添加它。

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

除非设置了RegexOptions.Multiline ,否则^匹配字符串的开头,无论它是否在行的开头。

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

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

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

 private static string _keyPlaceholder; private static TextParser 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"