Vb.net 用pipeet-fluent配置解析拉丁植物名称

Vb.net 用pipeet-fluent配置解析拉丁植物名称,vb.net,piglet,Vb.net,Piglet,我有以下的测试和课程。现在我只需要找到如何编写规则,它看起来很简单;-)。但我哪也不快。正如标签上所说,我想使用和学习仔猪 Public Class Plant Public Property Genus As String Public Property Species As String Public Property SubSpecies As String Public Property IsHybrid As Boolean End Class Pub

我有以下的测试和课程。现在我只需要找到如何编写规则,它看起来很简单;-)。但我哪也不快。正如标签上所说,我想使用和学习仔猪

Public Class Plant
    Public Property Genus As String
    Public Property Species As String
    Public Property SubSpecies As String
    Public Property IsHybrid As Boolean
End Class

Public Class ParserTests
    <Test>
    Public Sub IfGenusCanBeFoundWhenOnlyGenusAndSpiecesAreThere()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica")
        Assert.AreEqual("Salvia", result.Genus)
    End Sub

    <Test>
    Public Sub IfSpeciesCanBeFoundWhenOnlyGenusAndSpiecesAreThere()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica")
        Assert.AreEqual("sylvatica", result.Species)
    End Sub

    <Test>
    Public Sub IfSubSpeciesCanBeFoundWhenSubSpeciesIsProvided()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica sp. crimsonii")
        Assert.AreEqual("crimsonii", result.SubSpecies)
    End Sub

    <Test>
    Public Sub IfIsHybridIsTrueWhenxIsInNameCanBeFoundWhenSubSpeciesIsProvided()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia x jamensis")
        Assert.IsTrue(result.IsHybrid)
    End Sub

End Class
更新

多亏了Randompunter,我通过了前两次测试

Public Class ParseLatinPlantName

        Public Function Parse(ByVal name As String) As Plant
            Dim config = ParserFactory.Fluent()
            Dim expr = config.Rule()
            Dim name1 = config.Expression()
            name1.ThatMatches("\w+").AndReturns(Function(f) f)

            expr.IsMadeUp.By(name1).As("Genus") _
                    .Followed.By(name1).As("Species") _
                    .WhenFound(Function(f) New Plant With {.Genus = f.Genus, .Species = f.Species})

            Dim parser = config.CreateParser()
            Dim result = DirectCast(parser.Parse(name), Plant)
            Return result
        End Function
    End Class
首先,您的原始表达式(然后更正的表达式只匹配小写字母)。通过将其更改为与任何其他字母匹配的
\w+
,可以更正此错误

你的第二个测试失败了,因为你的语法不允许超过两个字母。您需要添加一条规则才能使其生效

例如,您有一个例子,其中提供了一个亚种。假设它的形式为.sp xxx是一个可选的传递对象,则需要为此提供单独的规则

Public Class Plant
    Public Property Genus As String
    Public Property Species As String
    Public Property SubSpecies As String
    Public Property IsHybrid As Boolean
End Class

Public Class ParserTests
    <Test>
    Public Sub IfGenusCanBeFoundWhenOnlyGenusAndSpiecesAreThere()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica")
        Assert.AreEqual("Salvia", result.Genus)
    End Sub

    <Test>
    Public Sub IfSpeciesCanBeFoundWhenOnlyGenusAndSpiecesAreThere()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica")
        Assert.AreEqual("sylvatica", result.Species)
    End Sub

    <Test>
    Public Sub IfSubSpeciesCanBeFoundWhenSubSpeciesIsProvided()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica sp. crimsonii")
        Assert.AreEqual("crimsonii", result.SubSpecies)
    End Sub

    <Test>
    Public Sub IfIsHybridIsTrueWhenxIsInNameCanBeFoundWhenSubSpeciesIsProvided()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia x jamensis")
        Assert.IsTrue(result.IsHybrid)
    End Sub

End Class
这通过了一个可选亚种的测试

Public Class ParseLatinPlantName

    Public Function Parse(ByVal name As String) As Plant
        Dim config = ParserFactory.Fluent()
        Dim expr = config.Rule()
        Dim subSpecies = config.Rule()
        Dim sp = config.Expression()
        sp.ThatMatches("sp\.").AndReturns(Function(f) f)
        Dim name1 = config.Expression()
        name1.ThatMatches("\w+").AndReturns(Function(f) f)
        Dim nothing1 = config.Rule()


        expr.IsMadeUp.By(name1).As("Genus") _
                .Followed.By(name1).As("Species") _
                .Followed.By(subSpecies).As("Subspecies") _
                .WhenFound(Function(f) New Plant With {.Genus = f.Genus, .Species = f.Species, .SubSpecies = f.Subspecies})
        subSpecies.IsMadeUp.By(sp).Followed.By(name1).As("Subspecies").WhenFound(Function(f) f.Subspecies) _
            .Or.By(nothing1)

        Dim parser = config.CreateParser()
        Dim result = DirectCast(parser.Parse(name), Plant)
        Return result
    End Function
End Class
请原谅,我的VB可能非常劣质,那是很久以前的事了。请注意,有一个表达式显式匹配“sp.”以将其与任何其他类型的名称区分开来。然后,该规则还与另一个不匹配的规则匹配。这使得亚种部分是可选的

我不确定你想从混合规则中解析什么。我假设它一定是一个名字后面跟着一个x,后面跟着另一个名字的东西,那么它就是一个混合体。要匹配这一点,请向解析器添加另一条规则

以下解析器通过了所有测试:

Public Class ParseLatinPlantName

    Public Function Parse(ByVal name As String) As Plant
        Dim config = ParserFactory.Fluent()
        Dim expr = config.Rule()
        Dim subSpecies = config.Rule()
        Dim hybridIndicator = config.Expression
        hybridIndicator.ThatMatches("x").AndReturns(Function(f) f)

        Dim sp = config.Expression()
        sp.ThatMatches("sp\.").AndReturns(Function(f) f)
        Dim name1 = config.Expression()
        name1.ThatMatches("\w+").AndReturns(Function(f) f)
        Dim nothing1 = config.Rule()


        expr.IsMadeUp.By(name1).As("Genus") _
                .Followed.By(name1).As("Species") _
                .Followed.By(subSpecies).As("Subspecies") _
                .WhenFound(Function(f) New Plant With {.Genus = f.Genus, .Species = f.Species, .SubSpecies = f.Subspecies}) _
                .Or.By(name1).As("FirstSpecies").Followed.By(hybridIndicator).Followed.By(name1).As("SecondSpecies") _
                .WhenFound(Function(f) New Plant With {.IsHybrid = True})

        subSpecies.IsMadeUp.By(sp).Followed.By(name1).As("Subspecies").WhenFound(Function(f) f.Subspecies) _
            .Or.By(nothing1)

        Dim parser = config.CreateParser()
        Dim result = DirectCast(parser.Parse(name), Plant)
        Return result
    End Function
End Class
如果表达式重叠,请按优先顺序声明,这一点很重要。如果在
hybridIndicator
之前声明
name1
x
将被识别为名称,导致解析失败。正如您可能注意到的,Piege默认情况下忽略空白,不需要为其制定规则。如果不需要此设置,可在配置程序中选择将其关闭。(使用忽略方法)

首先,您的原始表达式(然后更正的表达式只匹配小写字母)。通过将其更改为与任何其他字母匹配的
\w+
,可以更正此错误

你的第二个测试失败了,因为你的语法不允许超过两个字母。您需要添加一条规则才能使其生效

例如,您有一个例子,其中提供了一个亚种。假设它的形式为.sp xxx是一个可选的传递对象,则需要为此提供单独的规则

Public Class Plant
    Public Property Genus As String
    Public Property Species As String
    Public Property SubSpecies As String
    Public Property IsHybrid As Boolean
End Class

Public Class ParserTests
    <Test>
    Public Sub IfGenusCanBeFoundWhenOnlyGenusAndSpiecesAreThere()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica")
        Assert.AreEqual("Salvia", result.Genus)
    End Sub

    <Test>
    Public Sub IfSpeciesCanBeFoundWhenOnlyGenusAndSpiecesAreThere()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica")
        Assert.AreEqual("sylvatica", result.Species)
    End Sub

    <Test>
    Public Sub IfSubSpeciesCanBeFoundWhenSubSpeciesIsProvided()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia sylvatica sp. crimsonii")
        Assert.AreEqual("crimsonii", result.SubSpecies)
    End Sub

    <Test>
    Public Sub IfIsHybridIsTrueWhenxIsInNameCanBeFoundWhenSubSpeciesIsProvided()
        Dim parser = New ParseLatinPlantName
        Dim result = parser.Parse("Salvia x jamensis")
        Assert.IsTrue(result.IsHybrid)
    End Sub

End Class
这通过了一个可选亚种的测试

Public Class ParseLatinPlantName

    Public Function Parse(ByVal name As String) As Plant
        Dim config = ParserFactory.Fluent()
        Dim expr = config.Rule()
        Dim subSpecies = config.Rule()
        Dim sp = config.Expression()
        sp.ThatMatches("sp\.").AndReturns(Function(f) f)
        Dim name1 = config.Expression()
        name1.ThatMatches("\w+").AndReturns(Function(f) f)
        Dim nothing1 = config.Rule()


        expr.IsMadeUp.By(name1).As("Genus") _
                .Followed.By(name1).As("Species") _
                .Followed.By(subSpecies).As("Subspecies") _
                .WhenFound(Function(f) New Plant With {.Genus = f.Genus, .Species = f.Species, .SubSpecies = f.Subspecies})
        subSpecies.IsMadeUp.By(sp).Followed.By(name1).As("Subspecies").WhenFound(Function(f) f.Subspecies) _
            .Or.By(nothing1)

        Dim parser = config.CreateParser()
        Dim result = DirectCast(parser.Parse(name), Plant)
        Return result
    End Function
End Class
请原谅,我的VB可能非常劣质,那是很久以前的事了。请注意,有一个表达式显式匹配“sp.”以将其与任何其他类型的名称区分开来。然后,该规则还与另一个不匹配的规则匹配。这使得亚种部分是可选的

我不确定你想从混合规则中解析什么。我假设它一定是一个名字后面跟着一个x,后面跟着另一个名字的东西,那么它就是一个混合体。要匹配这一点,请向解析器添加另一条规则

以下解析器通过了所有测试:

Public Class ParseLatinPlantName

    Public Function Parse(ByVal name As String) As Plant
        Dim config = ParserFactory.Fluent()
        Dim expr = config.Rule()
        Dim subSpecies = config.Rule()
        Dim hybridIndicator = config.Expression
        hybridIndicator.ThatMatches("x").AndReturns(Function(f) f)

        Dim sp = config.Expression()
        sp.ThatMatches("sp\.").AndReturns(Function(f) f)
        Dim name1 = config.Expression()
        name1.ThatMatches("\w+").AndReturns(Function(f) f)
        Dim nothing1 = config.Rule()


        expr.IsMadeUp.By(name1).As("Genus") _
                .Followed.By(name1).As("Species") _
                .Followed.By(subSpecies).As("Subspecies") _
                .WhenFound(Function(f) New Plant With {.Genus = f.Genus, .Species = f.Species, .SubSpecies = f.Subspecies}) _
                .Or.By(name1).As("FirstSpecies").Followed.By(hybridIndicator).Followed.By(name1).As("SecondSpecies") _
                .WhenFound(Function(f) New Plant With {.IsHybrid = True})

        subSpecies.IsMadeUp.By(sp).Followed.By(name1).As("Subspecies").WhenFound(Function(f) f.Subspecies) _
            .Or.By(nothing1)

        Dim parser = config.CreateParser()
        Dim result = DirectCast(parser.Parse(name), Plant)
        Return result
    End Function
End Class

如果表达式重叠,请按优先顺序声明,这一点很重要。如果在
hybridIndicator
之前声明
name1
x
将被识别为名称,导致解析失败。正如您可能注意到的,Piege默认情况下忽略空白,不需要为其制定规则。如果不需要此设置,可在配置程序中选择将其关闭。(使用忽略方法)

那么,规则是什么?没有他们,开始很难,水晶球今天有点朦胧。。。还有,你试过什么?规则是让考试通过。你的问题是什么?你什么都没问。问题是,如何在小猪身上写规则。那么,规则是什么?没有他们,开始很难,水晶球今天有点朦胧。。。还有,你试过什么?规则是让考试通过。你的问题是什么?你什么都没问。问题是,如何用小猪来写规则。