首页 > 解决方案 > 如果子字符串包含在引用字符串中,如何使用布尔表达式进行匹配?

问题描述

我想将布尔运算符应用于字符串,以便通过在参考字符串中搜索某些子字符串返回真/假结果。如果引用字符串包含子字符串布尔表达式,那么我想要一个真实的结果。

想象一下,我有一个参考字符串,如下所示:

string refString = "This is a long text made by some different words."

我有以下由子字符串组成的布尔表达式:

string expression = "This is&words"

我想要实现的是基于布尔表达式对引用字符串的应用返回一个真/假结果。在此示例中,如果参考字符串包含子字符串"This is"和子字符串"words",我想要一个真实的结果。

我从这样的事情开始:

private const string And = @"&";
private const string Or = @"|";
private const string Xor = @"^";

private bool FindSubstring(string _refString, string _expression)
{
    string[] andExpression = _expression.Split(new string[] { And }, StringSplitOptions.None);
    string[] orExpression = _expression.Split(new string[] { Or }, StringSplitOptions.None);
    string[] xorExpression = _expression.Split(new string[] { Xor }, StringSplitOptions.None);

    if (andExpression.Length > 1)
        return andExpression.All(_refString.Contains);
    if (orExpression.Length > 1)
        return orExpression.Any(_refString.Contains);
    if (xorExpression.Length == 2)
        return _refString.Contains(xorExpression[0]) ^ _refString.Contains(xorExpression[1]);
}

它只适用于一个布尔运算符的简单操作,但如果我需要检查更复杂的表达式怎么办?

总的来说,它看起来很“丑陋”并且仅限于我:我将在表达式中添加一个转义字符检查,我需要大量代码来处理多个布尔运算符,我想我会发疯来处理带有嵌套括号的复杂表达式, 抄送。

是否存在像 Regex 这样的东西,我可以在其中编写一个复杂的布尔模式并与输入字符串匹配?

标签: c#regexstring

解决方案


是否存在像 Regex 这样的东西,我可以在其中编写一个复杂的布尔模式并与输入字符串匹配?

不,您要解析的表达式不是正则表达式,而是左递归上下文无关语法。那里有很多语法解析器和词法分析器(我个人使用 Irony.Net 和 Antlr),但是对于您的这个小语法,您可以编写自己的递归下降解析器,您只需要将左递归语法转换为一个右递归的。

还取决于你到底在做什么,Lucene.Net 可能会有所帮助。它会根据数据存储检查像您这样的布尔表达式,并返回带有“分数”的结果。从您的代码中不清楚这是一个 XY 问题,或者您是否真的只是针对一个字符串进行测试。


推荐阅读