You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用布尔表达式判断参考字符串中是否包含指定子串

实现子串布尔匹配的两种可行方案

方案1:直接使用正则表达式(最接近你要的类似Regex的原生方案)

正则的零宽正向预查特性天生支持子串存在性的布尔组合校验,不需要自己实现表达式解析逻辑:

  • 逻辑AND(同时包含A、B):正则写法为 ^(?=.*A)(?=.*B).*$,示例匹配你给出的测试用例:^(?=.*This is)(?=.*words).*$,只要参考字符串匹配该正则就返回true
  • 逻辑OR(包含A或B):正则写法为 ^(?=.*(A|B)).*$
  • 逻辑NOT(不包含A):正则写法为 ^(?!.*A).*$
  • 逻辑XOR(仅包含A或仅包含B):正则写法为 ^(?=.*A)(?!.*B).*$|^(?!.*A)(?=.*B).*$
  • 复杂嵌套逻辑:正则本身支持运算符优先级、分组嵌套,直接按正则语法编写即可,不需要额外开发解析代码。

对应的C#调用示例:

using System.Text.RegularExpressions;

// 封装校验方法
private bool FindSubstringByRegex(string refString, string pattern)
{
    return Regex.IsMatch(refString, pattern, RegexOptions.Singleline);
}

// 测试你的示例
string refString = "This is a long text made by some different words.";
// 对应"This is&words"的正则模式
string pattern = @"^(?=.*This is)(?=.*words).*$";
bool result = FindSubstringByRegex(refString, pattern); // 返回true

如果要保留你原来的&|^表达式语法,只需要加一个轻量的语法转换器,把你的自定义表达式转换成对应正则即可,不需要处理复杂的优先级、嵌套解析。

方案2:动态表达式执行(适合需要保留自定义布尔表达式语法的场景)

如果不想写正则,要支持原生的布尔表达式语法(支持括号、多运算符、优先级),可以将你的表达式字符串转换成可执行的LINQ表达式:

  1. 对输入的布尔表达式做转义处理,把所有子串替换为_refString.Contains("子串")的形式,比如"This is&words"替换为_refString.Contains("This is") && _refString.Contains("words")
  2. 用.NET的动态表达式解析能力直接执行该布尔表达式,就能得到结果,天然支持嵌套、多运算符、转义等场景。

对应的简化示例:

using System.Linq.Expressions;
using System.Linq.Dynamic.Core;

private bool FindSubstringByExpression(string refString, string expression)
{
    // 此处省略将你自定义的&|^替换为&&||^、处理子串转义的逻辑
    string processedExp = expression.Replace("&", "&&").Replace("|", "||");
    // 构造表达式参数
    var parameter = Expression.Parameter(typeof(string), "refString");
    // 动态解析表达式并执行
    var lambda = DynamicExpressionParser.ParseLambda(new[] { parameter }, typeof(bool), processedExp);
    return (bool)lambda.Compile().DynamicInvoke(refString);
}

内容的提问来源于stack exchange,提问作者Spaceman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 13:24:03