Lambda表达式:从较大的字符串中选择一个子字符串

时间:2019-01-09 07:39:11

标签: c# .net regex linq

这是我要处理的字符串

var str = 
  "$filter=HRRepName ne null and HRRepName ne '' and HRRepName eq 'jessica.l.hessling'&$top=1"

当前使用以下代码获取子字符串- jessica.l.hessling

var repName = odataQuery
  .Split(new string[] { "eq" }, StringSplitOptions.RemoveEmptyEntries)[1]
  .Split(new char[] { (char)39 })[1]
  .Replace("'", "")
  .Trim();

但是此索引稍后可能会产生错误,因此我想使用lambda表达式。

到目前为止我一直在尝试:

var repName2 = odataQuery
 .Split(new string[] { "HRRepName" }, StringSplitOptions.RemoveEmptyEntries)
 .Select(s.Substring(s.IndexOf("eq",StringComparison.Ordinal)+1));

2 个答案:

答案 0 :(得分:1)

好吧,我认为Regex在这里可能是非常好的选择,请尝试以下代码:

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 ',然后它将匹配所有内容,直到'字符与([^']+),方括号表示将其存储在捕获组中。

答案 1 :(得分:0)

您写道:

  

这可以是任何名称,我希望字符串在eq之后但在'&'之前

要查找项目是否在字符串中,和/或根据某种模式从字符串中提取子字符串,通常使用RegEx。

要在第一个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直到出现eq
  • (*.)捕获零个或多个字符
  • &直到此等式的第一个&之后

您可以使用online RegEx pattern testers

之一对此进行测试

捕获的项目在Match.Groups中。我还没有测试过,但据我所记得,这是一个IList,其中元素[0]是完整的匹配字符串,1是第一个捕获的项目。调试器将向您显示此内容。