C# Lambda表达式:从较大的字符串中选择一个子字符串
这是我试图处理的字符串C# Lambda表达式:从较大的字符串中选择一个子字符串,c#,.net,regex,linq,C#,.net,Regex,Linq,这是我试图处理的字符串 var str = "$filter=HRRepName ne null and HRRepName ne '' and HRRepName eq 'jessica.l.hessling'&$top=1" 目前正在使用以下代码获取子字符串-jessica.l.hessling 但这个索引可能会在以后创建bug,因此我想使用lambda表达式 到目前为止,我一直在尝试: var repName2 = odataQuery .Split(new string
var str =
"$filter=HRRepName ne null and HRRepName ne '' and HRRepName eq 'jessica.l.hessling'&$top=1"
目前正在使用以下代码获取子字符串-jessica.l.hessling
但这个索引可能会在以后创建bug,因此我想使用lambda表达式
到目前为止,我一直在尝试:
var repName2 = odataQuery
.Split(new string[] { "HRRepName" }, StringSplitOptions.RemoveEmptyEntries)
.Select(s.Substring(s.IndexOf("eq",StringComparison.Ordinal)+1));
好的,我认为正则表达式在这里可能是非常好的选择,请尝试以下代码:
var str = "$filter=HRRepName ne null and HRRepName ne '' and HRRepName eq 'jessica.l.hessling'&$top=1";
var match = (new Regex(@"HRRepName eq '([^']+)")).Match(str);
var extractedString = match.Success ? match.Groups[1] : null;
说明:HRRepName eq'[^']+将按字面意思匹配HRRepName eq',然后它将匹配所有内容,直到“字符与[^']+”,括号表示它将存储在捕获组中。您写道:
这可以是任何名称,我希望字符串在eq之后,但在'&'之前
要确定项是否在字符串中,和/或根据某种模式从字符串中提取子字符串,正则表达式通常是一种方法
要获取第一个等式之后以及第一个等式之前和之后的数据,请执行以下操作:
const string regexPattern = ".*eq(.*)&";
var match = RegEx.Match(regexPattern);
if (match.Success)
{ // found the pattern, it is in Match.Groups
ProcessMatch(match.Groups[1]); // [0] is complete matching string, [1] is first capture
}
模式:
*。以零个或多个字符开始字符串
直到第一次出现eq
*.捕获零个或多个字符
&直到第一次&在此之后
您可以使用
捕获的项目位于Match.Groups中。我还没有测试它,但据我记忆所及,这是一个IList,其中元素[0]是完整的匹配字符串,是第一个捕获的项。调试器将向您展示这一点。到目前为止,这个问题还不错,但是您能否对定义您要查找的子字符串的模式进行更多的概括?输入字符串中的哪些内容是固定的,哪些内容可以更改?您的代码在包含eq的字符串(例如equator)上无论如何都会失败。Mong Zhu:我已经提到了我正在寻找的字符串jessica.l.hessling,它可以是任何名称,我希望该字符串在eq之后,但在“&”之前。看起来您实际上想要解析或至少标记正在使用某种查询语言(如sql)的字符串。如果您有和…HRRepName eq'master.mequ'&$top=1字符串,该怎么办?请注意,eq现在是名称的一部分,因此拆分和子字符串解决方案都是不正确的。如果多输入一些样本,并定义可以有多少变化,这会更好。判断这是一个OData过滤器,您不能依赖于$top、$filter和其他的精确顺序。据我所知,c可以使用正向查找,是否有理由避免它或类似于?@LittleBit好吧,你是对的,它可以满足要求,但它是不必要的。我不知道OP是否了解正则表达式,而lookarounds不是基本的工具。此外,它可能会降低正则表达式的性能:
const string regexPattern = ".*eq(.*)&";
var match = RegEx.Match(regexPattern);
if (match.Success)
{ // found the pattern, it is in Match.Groups
ProcessMatch(match.Groups[1]); // [0] is complete matching string, [1] is first capture
}