超能力解析时,如何只匹配一行中的第一个字符串?
例如,我需要匹配 "A: Hello Goodbye\n" 中的 A 冒号,而不是 "Goodbye A: Hello\n" 中的冒号
超能力解析时,如何只匹配一行中的第一个字符串?
例如,我需要匹配 "A: Hello Goodbye\n" 中的 A 冒号,而不是 "Goodbye A: Hello\n" 中的冒号
在这里使用您的示例,我会将您的ActorParser
和NodeParser
定义更改为:
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()
在第一个解析器上加上 a 时用 a 链接它Or()
,但如果我不添加它会抛出错误。
此外,您在检查时的验证input[1]
不正确(可能只是复制粘贴问题)。它应该检查"Goodbye A: Hello"
而不是"Hello A: Goodbye"
我实际上做过类似的事情,但我不使用 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"
除非RegexOptions.Multiline
设置,^
匹配字符串的开头,无论它是否在行首。
您可能可以使用 inline(?m)
来打开多行:
static TextParser<Unit> Actor { get; } =
from start in Span.Regex(@"(?m)^[A-Za-z][A-Za-z0-9_]+:")
select Unit.Value;