Заменяет ли LINQ регулярное выражение во всех случаях? - PullRequest
3 голосов
/ 05 июня 2011

Может ли выражение LINQ заменить все случаи, когда регулярное выражение использовалось ранее?

Другими словами; существует ли регулярное выражение, которое не может быть представлено запросом LINQ?

Ответы [ 5 ]

10 голосов
/ 05 июня 2011

Вероятно, можно создать выражение LINQ для любого заданного регулярного выражения, но во многих случаях это, вероятно, будет неразумно. Даже если вы исключите такие вещи, как обратные ссылки, регулярные выражения могут быть сколь угодно сложными. Красота регулярных выражений (и я нахожу несколько удивительным, что я использую термин «красота» для описания регулярных выражений) в том, что это компактный и выразительный, но очень узко сфокусированный инструмент для сопоставления с образцом в строках.

LINQ, с другой стороны, является очень выразительным инструментом общего назначения.

Возьмите простое регулярное выражение, например (ab)+([0-9^%#@-.,]{1,5})ab[0-9]$. Можете ли вы написать выражение LINQ для этого? Если вы можете, это будет довольно многословно - конечно, гораздо более многословно, чем регулярное выражение, и вам придется включить код, который получает группы захвата. Вы должны не только сказать, соответствует ли строка выражению, но и сказать, где начинается совпадение, как долго оно длится и т. Д. Я подозреваю, что это возможно, но вы собираетесь написать множество пользовательских кодов для сделай это.

Я не большой поклонник регулярного выражения, но у него есть свое место. Иногда это действительно правильный инструмент для работы. Я воспользовался бы шансом заменить его чем-нибудь получше, но LINQ точно не так.

4 голосов
/ 05 июня 2011

"Другими словами; существует ли регулярное выражение, которое не может быть представлено запросом LINQ?"

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

:)

4 голосов
/ 05 июня 2011

Я никогда не думал о LINQ таким образом.Regex - это очень полный язык для сопоставления текста, тогда как LINQ - это язык запросов.LINQ имеет предикаты для сопоставления, но сам по себе не является инструментом сопоставления текста.Я бы не рекомендовал использовать LINQ вместо Regex.Каковы ваши намерения в этом случае.

1 голос
/ 06 июня 2011

Имеет ли значение Свободное регулярное выражение ?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);

Если да, то ответ да!

0 голосов
/ 05 июня 2011

Я думаю, что проблема, с которой вы столкнетесь, без RegEx, какие инструменты у вас остались для сопоставления с образцом? LINQ отлично подходит для упрощения чтения основанных на множествах и итеративных алгоритмов, но он не может самостоятельно выполнять сопоставление с образцом. В конечном итоге вы застрянете, используя библиотеку String, которая, к сожалению, менее выразительна, чем RegEx и почти наверняка не такая быстрая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...