2012-04-27 4 views
2

У меня такое выражение;Сборник по выпуску фильтра регулярных выражений

collection = collection.Where(x => Regex.IsMatch(x, "[a-zA-Z0-9+#-\\.\\s]+", RegexOptions.IgnoreCase)).ToList(); 

до фильтрации, коллекции есть такие элементы:

a+1, a#1, a-1, a.1, a 1, ab, a'1, [email protected], a*1, a&1, a:1, a!1 

после, я хочу только следующие элементы, чтобы остаться:

a+1, a#1, a-1, a.1, a 1, ab 

, но ни один элемент не выбрасывается.

Мне нужно сохранить только элементы, которые состоят из: букв, цифр, плюс, хеш, минус, точек, пробелов.

Как исправить это выражение регулярного выражения?

ответ

3

Ваше регулярное выражение проверяет, содержит ли элемент подстроку, соответствующую тексту. Поскольку все ваши элементы содержат a (что соответствует регулярному выражению), все элементы сохраняются.

Если вы хотите подстроки матч точно, заключите регулярное выражение в ^...$ (знаменуя начало и конец текста):

... Regex.IsMatch(x, "^[a-zA-Z0-9+#-\\.\\s]+$", ... 

EDIT: Кроме того, вы должны перейти черту - к концу группы:

... Regex.IsMatch(x, "^[a-zA-Z0-9+#\\.\\s-]+$", ... 

в противном случае, #-\\. матчи все символы из # - ..

+0

Спасибо, но у меня все еще есть проблемы, по какой-то причине 3 нежелательных элемента: a'1, a * 1 и a & 1, все еще есть, что-то вроде ерунды. – jwaliszko

+0

@JarekWaliszko: Вы правы, в вашем регулярном выражении была еще одна ошибка. Я отредактировал ответ. – Heinzi

+1

Спасибо, хороший совет, кстати: регулярные выражения предназначены для людей, которым действительно нравятся головоломки с умственным голосом;] – jwaliszko

Смежные вопросы