在所有情况下LINQ都会替换正则表达式

时间:2011-06-05 03:03:42

标签: c# regex linq programming-languages

LINQ表达式可以替换以前使用过regex的所有情况吗?

换句话说;是否存在无法用LINQ查询表示的正则表达式?

5 个答案:

答案 0 :(得分:10)

可能为任何给定的正则表达式创建LINQ表达式,但在许多情况下这样做可能是不合理的。即使你消除了诸如反向引用之类的东西,正则表达式也可能是任意复杂的。正则表达式的美妙(我发现使用术语“美”来描述正则表达式有点令人惊讶)是它是一个紧凑且富有表现力但非常狭隘的工具,用于字符串中的模式匹配。

另一方面,LINQ是一种非常富有表现力的通用工具。

采用像(ab)+([0-9^%#@-.,]{1,5})ab[0-9]$这样的简单正则表达式。你能为它写一个LINQ表达式吗?如果可以,它将会非常冗长 - 当然比正则表达式更冗长,并且您必须包含获取捕获组的代码。你不仅要说字符串是否匹配表达式,而且你必须说匹配开始的地方,它的长度等等。我怀疑它是可能的,但是你要编写大量的自定义代码来做到这一点。

我不是正则表达式的忠实粉丝,但它确实有它的位置。有时它确实是工作的正确工具。我抓住机会用更好的东西替换它,但LINQ肯定不是它。

答案 1 :(得分:4)

我从未想过以这种方式关于LINQ。 Regex是一种非常全面的文本匹配语言,而LINQ是查询语言。 LINQ确实有谓词来进行匹配,但它本身不是文本匹配工具。我不建议使用LINQ代替Regex。在这种情况下你的意图是什么。

答案 2 :(得分:4)

“换句话说,是否存在无法用LINQ查询表示的正则表达式?”

没有

var pattern = "anypattern";
string input = "someInput";
var q = input.Any(c => new Regex(pattern).IsMatch(input));

:)

答案 3 :(得分:1)

Fluent Regex是否有效?流利的正则表达式改变了这一点:

Regex socialSecurityNumberCheck = new Regex(@"^\d{3}-?\d{2}-?\d{4}$");

进入这个:

Regex socialSecurityNumberCheck = new Regex(Pattern.With.AtBeginning
    .Digit.Repeat.Exactly(3)
    .Literal("-").Repeat.Optional
    .Digit.Repeat.Exactly(2)
    .Literal("-").Repeat.Optional
    .Digit.Repeat.Exactly(4)
    .AtEnd);

如果是这样,答案是是的!

答案 4 :(得分:0)

我认为您遇到的问题是没有RegEx,您还有哪些工具可用于模式匹配? LINQ非常适合使基于集合和迭代的算法更容易阅读,但它不能自己进行模式匹配。你最终会陷入使用String库的问题,遗憾的是,这个库的表现力不如RegEx,而且几乎肯定不会那么快。