超级大国:仅当字符串开始一行时才匹配字符串
在超级大国中解析时,如果只是一个字符串中的第一个字符串,如何匹配字符串?
例如,我需要在“A:Hello Goodbye \ n”中匹配A冒号,而不是在“Goodbye A:Hello \ n”中匹配
在这里使用您的示例,我将您的ActorParser
和NodeParser
定义更改为:
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"