0

所以这是问题。这类似于正则表达式:我有一个模式并且可以知道表达式是否匹配。例如我有这样的图像

在此处输入图像描述

Hello world匹配也是如此,但Goodbye Town不是。

我该怎么做?我可以像这样构建一棵树,但我不知道如何使用它来检查输入是否匹配。

我使用了一个搜索,它类似于这个解决NHibernate 中的表达式树, 但根本不是。

4

1 回答 1

4

这是使用复合模式的合适时机。创建一个表达式接口,然后为 And、Or 和单个值创建类。然后,您可以组合这些类来创建您的树:

public interface IExpression
{
    bool Match(string value);
}

public class AndExpression : IExpression
{
    private IEnumerable<IExpression> expressions;

    public AndExpression(IEnumerable<IExpression> expressions)
    {
        this.expressions = expressions;
    }
    public bool Match(string value)
    {
        return expressions.All(exp => exp.Match(value));
    }
}
public class OrExpression : IExpression
{
    private IEnumerable<IExpression> expressions;

    public OrExpression(IEnumerable<IExpression> expressions)
    {
        this.expressions = expressions;
    }
    public bool Match(string value)
    {
        return expressions.Any(exp => exp.Match(value));
    }
}
public class ContainsExpression : IExpression
{
    private string search;
    public ContainsExpression(string search)
    {
        this.search = search;
    }

    public bool Match(string value)
    {
        return value.Contains(search);
    }
}

这是您提供的树的实现:

IExpression root = new AndExpression(new IExpression[]{
    new ContainsExpression("Hello"),
    new OrExpression(new IExpression[]{
        new ContainsExpression("World"),
        new ContainsExpression("Town")})});

请注意,如果您有适当的动机,您可以对 API 进行一些更改,以使构建这些树更加简洁。(即带有参数的可选构造函数重载。)

于 2013-08-05T20:02:35.840 回答