如何解决Linq条件,NOT等于3个变量的串联
我确实有一个非常有用的SO问题,其中我需要一个通配符解决方案。但是,我还需要一个“ 不等于”。
示例:
varFirst = "ABC"
varSecond = "DEF"
varThird = "GHI"
通常,没有“ 不相等”:
var x = vidaBiliy.SponsorPackage.Where(s => s.Policy == varFirst + varSecond + varThird ).FirstOrDefault();
因此,有人帮助我的是通配符,其中varSecond
可能是任何。
.Where(s => Regex.IsMatch(s.Policy,$"^{Regex.Escape(varFirst)}.*{Regex.Escape(varThird)}$"))
这似乎是正确的,因为第一个和最后一个变量完全匹配,而.*
的中间变量则完全匹配。
但是,使用正则表达式,我该如何用varSecond
做同样的事情,但不能等于DEF
。
解决方法
您可以使用
$"^{Regex.Escape(varFirst)}(?!{Regex.Escape(varSecond)}{Regex.Escape(varThird)}$).*{Regex.Escape(varThird)}$"
这意味着,如果varFirst
和varThird
之间只有varSecond
模式,则匹配将失败。表达式看起来像
^ABC(?!DEFGHI$).*GHI$
请参见regex demo。
详细信息
-
^
-字符串的开头 -
ABC
-varFirst
模式 -
(?!DEFGHI$)
-无varSecond
+varThird
模式,后跟字符串结尾 -
.*
-除换行符外的任何0+个字符 -
GHI
-varThird
值 -
$
-字符串的结尾。
像这样简单明了的事情怎么样?
设置:
private const string Starts = "ABC";
private const string NotMiddle = "DEF";
private const string Ends = "GHI";
private const string StartMiddleEnd = "ABCDEFGHI";
private const string StartCloseEnd = "ABCXDEFGHI";
private const string StartAnyEnd = "ABCANYGHI";
private const string StartAnything = "ABCANYTHING";
private const string AnythingEnd = "ANYTHINGGHI";
private static readonly List<string> Strings = new List<string>
{
StartMiddleEnd,StartCloseEnd,StartAnyEnd,StartAnything,AnythingEnd,};
然后运行:
public static void Test()
{
int startMiddleEndLength = Starts.Length + NotMiddle.Length + Ends.Length;
var results = Strings.Where(
s => s.StartsWith(Starts)
&& s.EndsWith(Ends)
&& (s.Length != startMiddleEndLength ||
s.Substring(Starts.Length,NotMiddle.Length) != NotMiddle));
foreach (var result in results)
{
Debug.WriteLine(result);
}
}
输出为:
ABCXDEFGHI
ABCANYGHI
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。