如何使用布尔表达式判断参考字符串中是否包含指定子串
实现子串布尔匹配的两种可行方案
方案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表达式:
- 对输入的布尔表达式做转义处理,把所有子串替换为
_refString.Contains("子串")的形式,比如"This is&words"替换为_refString.Contains("This is") && _refString.Contains("words") - 用.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
相关产品推荐
相关产品推荐

