如果子字符串包含在引用字符串中,如何使用布尔表达式进行匹配?

Posted

技术标签:

【中文标题】如果子字符串包含在引用字符串中,如何使用布尔表达式进行匹配?【英文标题】:How can I use a boolean expression to match if substrings are contained in reference string? 【发布时间】:2021-08-03 13:47:36 【问题描述】:

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

假设我有一个如下的引用字符串:

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

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

string expression = "This is&words"

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

我是这样开始的:

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]);

仅使用一个布尔运算符即可进行简单操作,但如果我需要检查更复杂的表达式怎么办?

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

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

【问题讨论】:

我可以想到一个递归函数,它根据你的规则将你的原始(复杂)表达式分解成小块。 【参考方案1】:

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

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

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

【讨论】:

感谢您的输入,我将检查您提到的解析器,看看它们是否适合我的场景。为了给我正在做的事情提供更多背景信息:我正在接收包含长字符串的 SNMP 陷阱,我需要解析这些字符串并检查它们是否包含在布尔表达式中指定的子字符串。

以上是关于如果子字符串包含在引用字符串中,如何使用布尔表达式进行匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如果子字符串列表中的任何值包含在数据框中的任何列中,则过滤行

在 C# 中使用括号验证布尔表达式

如果子字符串存在,则从元组中删除项目

regex_note

从列表创建组合,如果子字符串到分隔符字符位于列表项的 1 个以上的子元素中,则从列表中删除

numbers:两个表中查找相同的数据