LINQ是否在所有情况下都替换regex



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

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

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

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

(ab)+([0-9^%#@-.,]{1,5})ab[0-9]$这样的简单正则表达式为例。你能为此写一个LINQ表达式吗?如果可以的话,它将非常详细——当然比regex详细得多,并且必须包含获取捕获组的代码。你不仅要说字符串是否与表达式匹配,还要说匹配从哪里开始,有多长,等等。我怀疑这是可能的,但你要写很多自定义代码来做到这一点。

我不是regex的超级粉丝,但它确实有它的位置。有时它真的是适合这份工作的工具。我会抓住机会用更好的东西代替它,但LINQ肯定不是。

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

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

没有。

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

:)

Fluent Regex算不算?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);

如果是,答案是

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

相关内容

  • 没有找到相关文章

最新更新