Оператор регулярного выражения и лайк в LinqToObjects - PullRequest
1 голос
/ 19 октября 2011

Просто, чтобы избежать путаницы, я говорю о linq to object и ничего больше. Я работаю с большим количеством объектов в памяти, и мне нужно отфильтровать их. у нас есть экран с большим количеством опций, где пользователь может выбрать много значений.

Мне нужно реализовать что-то похожее на оператор «Мне нравится» в SQL. Я нашел сообщение об этом на этом сайте и использую регулярные выражения, но я никогда не использовал его. Я хочу знать, правильный ли мой шаблон строки. Не следует использовать "%" "%"?

Я также читал, что вы должны использовать комбинацию startWith -endWith и содержит, но я не нашел ни одного примера, который бы использовал все их вместе, просто чтобы понять, как это сделать.

Я делаю что-то вроде этого

string pattern = string.Format(".*{0}.*", criteria.SearchText);
myList= myList.Where(x => x.Message.Like(pattern)).ToList();

public static bool Like(this string s, string pattern, RegexOptions options = RegexOptions.IgnoreCase)
{
    return Regex.IsMatch(s, pattern, options);
}

Любые предложения

1 Ответ

5 голосов
/ 19 октября 2011

Если вы хотите проверить, содержит ли строка другую, вы можете использовать:

myList = myList.Where(x => x.Message.Contains(criteria.SearchText)).ToList();

или

myList = myList.Where(x => x.Message.IndexOf(criteria.SearchText) != -1).ToList();

(второй вариант хорош, потому что с IndexOf вы можете указать CultureInfo)

Если вы хотите смешать пользовательское слово в Regex, вы должны использовать Regex.Escape(), чтобы экранировать его, так что если пользователь пишет a*, искомый текст будет a* вместо any number of a.

string pattern = string.Format(".*{0}.*", Regex.Escape(criteria.SearchText));

Но обратите внимание, что, как написано, это эквивалентно:

string pattern = string.Format("{0}", Regex.Escape(criteria.SearchText));

потому что вы не добавили привязки к своему регулярному выражению, поэтому регулярное выражение будет искать в любом месте строки.

Если вы хотите привязать пользовательское слово, например, вы хотите искать слова, начинающиеся с

string pattern = string.Format("^{0}", Regex.Escape(criteria.SearchText));

или заканчивается

string pattern = string.Format("{0}$", Regex.Escape(criteria.SearchText));
...