LINQ表达式可以替换以前使用过regex的所有情况吗?
换句话说;是否存在无法用LINQ查询表示的正则表达式?
答案 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
,而且几乎肯定不会那么快。