使用正则表达式的 Linq 选择

Posted

技术标签:

【中文标题】使用正则表达式的 Linq 选择【英文标题】:Linq select with regex 【发布时间】:2019-10-22 19:14:09 【问题描述】:

我想从我的列表中提取像aaa.a1aaa.a2 这样的字符串。所有这些字符串都包含"aaa."

如何将 Regex 与 Linq 结合使用?

var inputList = new List<string>()  "bbb aaa.a1 bbb", "ccc aaa.a2 ccc" ;

var result = inputList.Where(x => x.Contains(@"aaa.")).Select(x => x ???? ).ToList();

【问题讨论】:

长度是固定的吗?还是后面总是有空格? 不,它是可变的。但总有一个空间。 从您的示例中,它看起来前后总是有一个空格,所以为什么不使用 string.split(" ") 并检查是否有任何子字符串包含“aaa” 出于进一步提取的原因,我需要正则表达式。 如果您对我的解决方案有任何疑问,请告诉我。我认为你不能依赖.Where(x =&gt; x.Contains(@"aaa.")),因为这会在任何上下文中检查aaa.,而在这里检查单词边界是有意义的。 【参考方案1】:

你可以使用

var inputList = new List<string>()  "bbb aaa.a1 bbb", "ccc aaa.a2 ccc" ;
var result = inputList
    .Select(i => Regex.Match(i, @"\baaa\.\S+")?.Value)
    .Where(x => !string.IsNullOrEmpty(x))
    .ToList();
foreach (var s in result)
    Console.WriteLine(s);

输出:

aaa.a1
aaa.a2

见C# demo

Regex.Match(i, @"\baaa\.\S+")?.Value 部分尝试匹配每个项目中的以下模式:

\b - 单词边界 aaa\. - aaa. 子字符串 \S+ - 1+ 非空白字符。

.Where(x =&gt; !string.IsNullOrEmpty(x)) 将丢弃由没有匹配字符串的项目产生的空项目。

【讨论】:

【参考方案2】:

您可以尝试稍微不同的解决方案:

var result = inputList
  .Where(i => Regex.Match(i, @"\baaa\.[a-z0-9]+")?.Success)
  // or even
  // .Where(i => Regex.Match(i, @"\ba+\.[a-z0-9]+")?.Success)

【讨论】:

我也喜欢你的解决方案。 :D

以上是关于使用正则表达式的 Linq 选择的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:使用正则表达式从查询中排除结果

LINQ 更改 dict 中的 KeyValuePair

jquery的选择器中可以使用使用正则表达式吗?

如何修复这个正则表达式?

17._5正则表达式的替换

jQuery 选择器正则表达式