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
,而且几乎肯定没有那么快。