在超能力中进行解析时,仅当字符串在一行中时才如何匹配字符串?
例如,我需要在“ A:Hello Goodbye \ n”中匹配A冒号,而不是在“ Goodbye A:Hello \ n”中匹配A >
答案 0 :(得分:1)
使用您的示例here,我将您的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()
与{{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"