Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda表达式:从较大的字符串中选择一个子字符串_C#_.net_Regex_Linq - Fatal编程技术网

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
}